algorithm - 为什么冒泡排序是 O(n^2)?

标签 algorithm sorting complexity-theory big-o bubble-sort

for (int front = 1; front < intArray.length; front++)
{
    for (int i = 0; i  < intArray.length - front; i++)
    {
        if (intArray[i] > intArray[i + 1])
        {
            int temp = intArray[i];
            intArray[i] = intArray[i + 1];
            intArray[i + 1] = temp;
        }
    }
}

内部循环正在迭代:n + (n-1) + (n-2) + (n-3) + ... + 1 次。

外循环正在迭代:n 次。

所以你得到 n *(数字 1 到 n 的总和)

不就是 n * ( n*(n+1)/2 ) = n * ( (n^2) + n/2 )

哪个是 (n^3) + (n^2)/2 = O(n^3) ?

我肯定我做错了。为什么不是 O(n^3)?

最佳答案

你是正确的,外循环迭代 n 次,内循环也迭代 n 次,但你重复计算了工作量。如果您通过对顶层循环的每次迭代完成的工作求和来计算完成的总工作量,您会得到第一次迭代不工作,第二次 n - 1,第三次 n - 2 等,因为第 i顶层循环的迭代让内部循环执行 n - i 工作。

或者,您可以通过将内部循环完成的工作量乘以该循环运行的总次数来计算完成的工作。内部循环在每次迭代中执行 O(n) 的工作,而外部循环运行 O(n) 次迭代,因此总工作量为 O(n2)。

您试图将这两种策略结合起来是在犯错误。的确,外循环第一次做 n 次工作,然后是 n - 1,然后是 n - 2,等等。但是,您不会将此工作量乘以 n to 以获得总数。这将计算每次迭代 n 次。相反,您可以将它们相加。

希望这对您有所帮助!

关于algorithm - 为什么冒泡排序是 O(n^2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477743/

相关文章:

r - 如何从数据框中按降序获取前n家公司

time-complexity - 用两个参数确定算法的运行时间

algorithm - 汉诺塔的替代简单英语算法

algorithm - 具有虚拟内存和写入组合的并行基数排序

c++ - 如何使用 C++ 查找 N x M 数组内最小值(不同列)的总和?

.net - 使用随机比较委托(delegate)的 List.Sort 可以无限运行吗?

用于可索引字符串列表的 Python 数据结构

arrays - 为什么快速排序平均比其他排序快?

java - 最小优先级队列的复杂性问题

算法和编程的复杂性