冒泡排序C错误代码! [Deitel C第6版]

时间:2016-09-27 18:17:19

标签: c algorithm data-structures

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次。

有人请说明这个冒泡排序程序是如何工作的?干杯!

1 个答案:

答案 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;
}