int main(void)
{
int a[5] = {36,24,10,6,12};
int pass;
int i;
int hold;
/* bubble sort */
/* loop to control number of passes */
for(pass=1; pass<5; pass++){
/* loop to control number of comparisons per pass */
for(i=0; i<5; i++){
if(a[i] > a[i+1]){
hold = a[i];
a[i] = a[i+1];
a[i+1] = hold;
}
}
}
return 0;
}
在此冒泡排序程序中,if语句比较相邻元素的值。 如果计数器I变为4,那么如果a [4]&gt; a [4 + 1]所以我的问题是数组中没有[5]元素,所以程序如何比较和工作?
我不理解(pass = 1; pass&lt; 5; pass ++)循环。这个循环的作用是什么?为什么循环从1开始并继续4次而不是5次。
有人请说明这个冒泡排序程序是如何工作的?干杯!
答案 0 :(得分:0)
嗯,大家都在评论中回答了这个问题,但是没有人花时间写出实际答案,所以我会担任这个角色。
首先,你粘贴的代码中有一个Bug:
阵列int a[5]
有5个成员[0..4],
当执行给定for(i=0; i<5; i++)
的内循环i=4
时,
a[i+1]
正在访问超出数组范围的a[5]
,它的值可能是意外的。
值得注意的是:因为示例值int a[5] = {36,24,10,6,12};
非常小,所以代码仍然很有可能(36/2 ^ 32),因为a[5]
将具有最大值,并赢得'被覆盖或移动。
但如果您尝试将值更改为int a[5] = {36,0xFFFFFFFF,10,6,12};
,那么该程序肯定会失败!
第二个你的另一个问题:
每次迭代(通过)时,最大值会冒泡到它的位置,因此就会到位......
对于5个数字,在将4个放在其位置后,最后一个隐含地给出
这就是为什么不需要进行第5次迭代。
此外,在第二次到第二次迭代中,从内部循环中排除最后一个元素是很常见的,因为它们已知就位。
int main(void)
{
int a[5] = {36,24,10,6,12};
int pass;
int i;
int hold;
/* bubble sort */
/* loop to control number of passes */
for(pass=4; pass > 0; pass--){ /* pass counts down 4 iterations */
/* loop to control number of comparisons per pass */
/* 0..4, then 0..3 > 0..2, and lastly 0..1 */
for(i=0; i<pass; i++){
if(a[i] > a[i+1]){
hold = a[i];
a[i] = a[i+1];
a[i+1] = hold;
}
}
}
return 0;
}