【问题标题】:Why Bubble sort complexity is O(n^2)?为什么冒泡排序复杂度为 O(n^2)?
【发布时间】:2013-01-28 09:43:06
【问题描述】:

据我了解,算法的复杂性是排序时执行的最大操作数。因此,冒泡排序的复杂度应该是算术级数的总和(从 1 到 n-1),而不是 n^2。 以下实现计算比较次数:

public int[] sort(int[] a) {
    int operationsCount = 0;
    for (int i = 0; i < a.length; i++) {
        for(int j = i + 1; j < a.length; j++) {
            operationsCount++;
            if (a[i] > a[j]) {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    System.out.println(operationsCount);
    return a;
}

10 个元素的数组的输出是 45,所以它是从 1 到 9 的等差数列之和。

那么为什么冒泡排序的复杂度是 n^2,而不是 S(n-1)?

【问题讨论】:

    标签: complexity-theory sorting bubble-sort


    【解决方案1】:

    最坏的情况: 表示给定任何大小为 n 的输入,算法执行的最长运行时间

    所以我们将考虑这个最坏情况的完全倒退列表

    int[] arr= new int[]{9,6,5,3,2};
    
    Number of iteration or for loops required to completely sort it  = n-1 //n - number of elements in the list
    
    1st iteration requires (n-1) swapping + 2nd iteration requires (n-2) swapping + ……….. + (n-1)th iteration requires (n-(n-1)) swapping
    
    i.e. (n-1) + (n-2) + ……….. +1 = n/2(a+l) //sum of AP
    =n/2((n-1)+1)=n^2/2
    

    如此大的 O 表示法 = O(n^2)

    【讨论】:

      【解决方案2】:

      让我们做一个最坏的情况分析。

      在最坏的情况下,if (a[i] &gt; a[j]) 测试将始终为真,因此接下来的 3 行代码将在每个循环步骤中执行。内部循环从 j=i+1 到 n-1,因此它将执行 Sum_{j=i+1}^{n-1}{k} 基本操作(其中 k 是涉及创建 temp 变量、数组索引和值复制的操作的常量数量)。如果你求解求和,它给出的基本操作数等于k(n-i-1)。外部循环将重复此k(n-i-1) 基本操作,从 i=0 到 i=n-1(即Sum_{i=0}^{n-1}{k(n-i-1)})。所以,再一次,如果你解决求和,你会看到基本操作的最终数量与 n^2 成正比。该算法在最坏情况下是二次的。

      当您在内循环中运行任何代码之前增加变量 operationsCount 时,我们可以说我们之前的分析中的 k(在内循环中执行的基本操作的数量)是 1。所以,解决 @987654328 @ 给出 n^2/2 - n/2,将 n 替换为 10 得到的最终结果为 45,与运行代码得到的结果相同。

      【讨论】:

        【解决方案3】:

        这是因为大 O 表示法描述了算法的性质。扩展(n-1) * (n-2) / 2 中的主要术语是n^2。随着n 的增加,所有其他术语都变得微不足道。

        欢迎您更准确地描述它,但出于所有意图和目的,该算法表现出的行为n^2。这意味着,如果您根据n 绘制时间复杂度,您将看到一条抛物线增长曲线。

        【讨论】:

        • 在冒泡排序的情况下,实际操作数比 n^2 小 2 倍。为什么使用近似值而不是确切的操作次数?也许比较一些算法,这种差异很重要。你是怎么得到(n-1) * (n-2) / 2 的?总和(1 到 n-1)计算为(1 + (n-1))/2 * (n-1) = (n^2 - n) / 2
        • 当然,如果您愿意,可以近似为n^2 / 2。但它仍然表现出n^2 的增长。这就是重点。
        猜你喜欢
        • 2012-07-13
        • 2012-09-12
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 2021-06-18
        • 2015-09-12
        • 2020-12-14
        • 2022-01-11
        相关资源
        最近更新 更多