冒泡排序外圈和N-1

时间:2016-09-17 15:57:23

标签: c bubble-sort

我已经阅读了关于冒泡排序的多篇帖子,但仍难以用语言表达我的代码工作原理,特别是关于外循环。

for (int i = 0; i < (n - 1); i++)
{
    for (int j = 0; j < (n - i - 1); j++)
    {
        if (array[j] > array[j + 1])
        {
            int temp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = temp;
         }
     }
 }

对于任何长度为n的数组,最多可以进行n-1次成对比较。那就是说,如果我们停在i&lt; n-1,我们永远最后的元素。如果,在最坏的情况下,数组的元素(我在这里思考)是相反的顺序,我们不能假设它在适当的位置。所以,如果我们从不检查外部循环中的最终数组元素,那么它怎么可能起作用呢?

4 个答案:

答案 0 :(得分:2)

数组索引以0到n-1完成。如果数组中有10个元素,则索引将为n-1。因此,首先,将进行内循环(n-1)比较的迭代。泡沫排序的第一步将使最大数字冒出来。

在下一次迭代(n-1-1)中,将发生迭代,它会将第二大值冒泡到其位置,依此类推,直到整个数组都被排序。

答案 1 :(得分:1)

n通常是数组中元素的数量,因此如果数组中有10个元素,则元素将从0到9编制索引。您不希望在外部循环中访问数组[10],因为这会产生用于访问数组边界的段错误,因此在循环条件语句中使用“n -1”。在C中,当编写和调用包含迭代数组的函数时,数组的大小也作为参数传递。

答案 2 :(得分:1)

在此行中,您将访问j

当前位置之前的1个元素
 array[j + 1];

在循环的第一次迭代中,运行j从0到j&lt;(n-0-1),因此当访问数组[j + 1]时,你可以得到的数组的最后一个索引是j小于n。因此,如果您将数组声明为array [n],则会获得数组的最后一个元素。

答案 3 :(得分:1)

n表示“所有元素的数量”。循环中的初始数为0,范围为0到(n-1);所以我们会得到n个元素;所有元素都将被旅行。