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

Posted

技术标签:

【中文标题】为啥我们在冒泡排序算法中进行 n-1 次迭代【英文标题】:Why do we make n-1 iterations in bubble sort algorithm为什么我们在冒泡排序算法中进行 n-1 次迭代 【发布时间】:2018-05-11 18:41:28 【问题描述】:

冒泡排序算法最常见的方式是有两个 for 循环。内部从 j=0 到 j n-i-1 完成。我假设我们减去减 i,因为当我们到达最后一个元素时,我们不会比较它,因为我们在他之后没有元素。但是为什么我们使用n-1。为什么我们不从 i=0 到 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 次迭代?

【问题讨论】:

你能解释一下为什么 n-i-1..我挣扎了很多,但没有找到答案..? 【参考方案1】:

因为交换至少需要两个元素。

所以如果你有 6 个元素,你只需要考虑 5 个连续的对。

【讨论】:

我对 n-i-1 的理解正确吗?是否意味着跳过数组中最后一项的比较,因为我们后面没有元素? @CaL17 数组未排序部分的最后一项 非常感谢您提供此信息但如果您还可以解释内部循环中 n-i-1 的逻辑,那将是一个很大的帮助..【参考方案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,这是新数组中最后一个元素的索引以及需要比较的数量。

希望对你有帮助!

【讨论】:

以上是关于为啥我们在冒泡排序算法中进行 n-1 次迭代的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序

冒泡排序及优化

冒泡排序的JavaScript实现

冒泡排序和选择排序

冒泡排序简易分析(py, js)

冒泡排序和选择排序