代码之家  ›  专栏  ›  技术社区  ›  Valdas S

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

  •  4
  • Valdas S  · 技术社区  · 7 年前

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

    2 回复  |  直到 7 年前
        1
  •  12
  •   Bathsheba    7 年前

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

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

        2
  •  11
  •   Gibs    6 年前

    为了在阵列中进行比较,需要两个相邻的单元;在一个由6个元素组成的数组中,只进行5次比较;在10个元素的数组中,进行9次比较,依此类推:

    array and comparisons between adjacent cells

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

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

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

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

    希望有帮助!