冒泡排序外循环和N-1

Bubble Sort Outer Loop and N-1

我已经阅读了多篇关于冒泡排序的文章,但仍然很难说出我的代码为何有效,尤其是在外循环方面。

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 < n-1 处停止,我们永远不会 看到 最后一个元素。如果在最坏的情况下,数组的元素(我在这里认为是整数)的顺序相反,我们就不能假设它在正确的位置。所以,如果我们从不检查外循环中的最终数组元素,这怎么可能起作用?

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

在这一行中,您正在访问 j 当前位置之前的 1 个元素

 array[j + 1];

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

数组索引从0到n-1。如果数组中有 10 个元素,索引将为 n-1。因此,首先,将进行内循环 (n-1) 比较的迭代。冒泡排序的第一遍会将最大的数字冒泡到它的位置。

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

n表示"number of all the elements"。循环中初始编号为0,范围从0到(n-1);所以我们会得到 n 个元素;所有元素都将旅行销售。