一尘不染

为什么气泡排序为O(n ^ 2)?

algorithm

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)?


阅读 207

收藏
2020-07-28

共1个答案

一尘不染

您是正确的,即外循环迭代n次,内循环也迭代n次,但是您正在重复计算工作。如果通过对顶级循环的每次迭代所完成的工作求和来计算完成的总工作量,则您会发现自第i个迭代以来,第一个迭代有n个工作,第二个n-1,第三个n-2等。顶层循环的迭代具有内部循环n - i

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

您通过尝试将这两种策略结合起来而犯了一个错误。的确,外循环第一次执行n次,然后是n-1,然后是n-2,依此类推。但是,您不必将此工作乘以n即可得出总数。这将计算每次迭代n次。相反,您可以将它们加在一起。

希望这可以帮助!

2020-07-28