为什么我们在冒泡排序算法中进行n-1次迭代

时间:2017-11-28 10:33:54

标签: c++ sorting bubble-sort

最常见的冒泡排序算法是拥有两个for循环。内部一个从j = 0到j n-i-1完成。我假设我们减去减去i,因为当我们到达最后一个元素时,我们不会比较它,因为我们没有一个元素在他之后。但为什么我们使用n-1。为什么我们不从i = 0运行外循环直到i <0。 n和内部从j = 0到n-i?有人可以向我解释一下,互联网上的教程并没有强调这一点。

for (int i = 0; i < n - 1; i++) // Why do we have n-1 here?
    {
        swapped = false;
        for (int j = 0; j < n - i - 1; j++)
        {
            countComparisons++;
            if (arr[j] > arr[j + 1])
            {
                countSwaps++;
                swap(&arr[j], &arr[j + 1]);
                swapped = true;
            }

        }
     }

例如,如果我有一个包含6个元素的数组,为什么我只需要进行5次迭代?

1 个答案:

答案 0 :(得分:2)

出于比较目的,需要两个相邻的单元格;在由6个元素组成的数组中,您只能进行5个比较;包含10个元素的数组,9个比较,依此类推:

array and comparisons between adjacent cells

所以对于7个元素,只进行了6次比较,因此在 for 循环的外部n-1的一般规则

关于 n-1-i 表达式,请记住,冒泡排序中的最高(或最低,取决于排序标准)值在第一个循环后到达数组的最后位置,因此无需将该值与其他值进行比较,因此必须一次“缩短”一个单元格1个单元格,并且外循环中的 i 值是负责该操作的计数器在内部循环中:

5 | 3 | 9 | 20 |元素(n)= 4

在第一个周期( i = 0 )之后,20已到达数组中的正确位置(使用升序),剩下3个元素组成的数组与之进行比较;在下一个循环中, i 将等于1,并且由于n-1保持不变,我们需要在该表达式中减去1以“缩短”数组: n-1-i = 4-1-1 = 2,它是该新数组中最后一个元素的索引以及所需的比较次数。

希望有帮助!