c - C中的冒泡排序
问题描述
我正在尝试在 C 中编写冒泡排序算法以进行练习和修订,但是,我遇到了一些问题:我试图在 20 个随机数的数组中的每次迭代后打印每个交换,但是,程序似乎摆脱由于某种原因比以前的项目大的项目。
这是代码:
int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72,
88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
for (i=0; i<19; i++)
{
for(j=0;j<18;j++){
if(SortData[j]>SortData[j+1])
{
temp = SortData[j];
SortData[j]=SortData[j+1];
SortData[j+1]=temp;
printf("|%d", SortData[j]);
}
}
printf("\n");
}
printf("\n");
system("pause");
return 0;
以下是运行此代码时发生的情况:
|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|17|2|4|67|54|0|44|78|89|21|45|72|88|65|97
|17|2|4|54|0|44|21|45|72|88|65
|17|2|4|0|44|21|45|72|65
|2|4|0|21|45|65
|0|21|45|65
|0|21|65
|0|21
|0
Process returned 10 (0xA) execution time : 3.072 s
Press any key to continue.
此外,我进行了一些测试来检查数组的排序或打印是否存在错误,以下是该测试的结果:
int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72,
88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
for (i=0; i<19; i++)
{
for(j=0;j<18;j++){
if(SortData[j]>SortData[j+1])
{
temp = SortData[j];
SortData[j]=SortData[j+1];
SortData[j+1]=temp;
}
}
}
for (i=0; i<20; i++){
printf("|%d", SortData[i]);//Error here as 25 isn't sorted
}
printf("|");
printf("\n");
system("pause");
return 0;
与上述代码段相比,此代码段的唯一变化是打印语句来自嵌套的 for 循环并使用单独的 for 循环打印,这种工作,因为数字已排序,但由于某种原因 25 不是:
|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|0|2|4|17|20|21|43|44|45|54|65|67|72|78|88|89|90|97|100|25|
Press any key to continue . . .
所以事实证明,排序和打印存在问题。关于如何打印交换的每次迭代并让它正确交换,我能否提供一些提示?
更新:
所以我在嵌套的 for 循环中增加了循环计数器,现在它对数组进行排序并显示每次迭代。更改后的代码如下所示:
int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
for (i=0; i<20; i++)
{
for(j=0;j<19;j++){
if(SortData[j]>SortData[j+1])
{
temp = SortData[j];
SortData[j]=SortData[j+1];
SortData[j+1]=temp;
}
printf("|%d", SortData[j]);//Changed code
}
printf("\n");
}
//for (i=0; i<20; i++){
// printf("|%d", SortData[i]);//Error here as 25 isn't sorted
//}
printf("|");
printf("\n");
system("pause");
return 0;
现在它确实显示了每次迭代并对其进行排序,但由于某种原因,数字 100 从数组中消失了,因此它只对 19 个项目而不是 20 个项目进行排序:
|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|20|43|17|2|4|67|54|0|44|78|89|21|45|72|88|65|90|97|25
|20|17|2|4|43|54|0|44|67|78|21|45|72|88|65|89|90|25|97
|17|2|4|20|43|0|44|54|67|21|45|72|78|65|88|89|25|90|97
|2|4|17|20|0|43|44|54|21|45|67|72|65|78|88|25|89|90|97
|2|4|17|0|20|43|44|21|45|54|67|65|72|78|25|88|89|90|97
|2|4|0|17|20|43|21|44|45|54|65|67|72|25|78|88|89|90|97
|2|0|4|17|20|21|43|44|45|54|65|67|25|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|54|65|25|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|54|25|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|25|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|25|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|25|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|
Press any key to continue . . .
为什么100会消失?
解决方案
这很好用,你犯了一个小错误:
int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
//before for(i=0; i<19; i++)
for (i=0; i<20; i++)// i < 20 or it will skip the last number
{
//before for(j=0; j<18; j++)
for(j=0;j<19;j++){
if(SortData[j]>SortData[j+1])
{
temp = SortData[j];
SortData[j]=SortData[j+1];
SortData[j+1]=temp;
}
}
}
for (i=0; i<20; i++){
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
return 0;
如果要打印冒泡排序的每次迭代,代码如下:
int i, j, temp, h;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
for (i=0; i<20; i++)
{
for(j=0;j<19;j++){
if(SortData[j]>SortData[j+1])
{
temp = SortData[j];
SortData[j]=SortData[j+1];
SortData[j+1]=temp;
for (h=0; h<20; h++)
{
printf("|%d", SortData[h]);
}
printf("|");
printf("\n");
}
}
}
return 0;
}
推荐阅读
- python - 如何生成正方形、五边形等网格形状?
- javascript - Expo Audio - 当我改变屏幕时如何停止音频
- discord.js - TypeError:message.reply 不是函数
- laravel - 如何处理图片上传+优化
- html - 我在使用外部 CSS 文件设置 HTML 表格样式时遇到问题
- vba - 使用接收时间和发件人姓名保存电子邮件附件
- ios - 如何控制/禁用 IOS 中用于导航的滑动快照(JS)
- c# - 如何使用类创建计算字段 iIn Entityframwork
- javascript - 初始化前无法访问“actionCreator”
- javascript - 反应错误 - “道具验证中缺少”