为什么选择排序或冒泡或插入排序的效率被认为是n ^ 2而不是n(n-1)/ 2

时间:2016-09-26 20:57:08

标签: algorithm performance sorting big-o

假设我有一个降序数组(最坏情况场景),如:

Nums = {50,40,30,20,10}(size = 5)

现在如果我使用选择排序(将按升序排序):

选择排序算法:

for(i=0; i<=size-2; i++)
{
    for(j=i+1; j<=size-1; j++)
    {
        if(Nums[i]>Nums[j])
       {
            temp=Nums[i]; 
            Nums[i]=Nums[j]; 
            Nums[j]=temp; 
       } 
    }
}

现在如果我们分析执行的操作或迭代次数,下面是比较索引的方法

(OuterLoopIndex Vs InnerLoopIndex):

1st Iteration: 0 - 1,  0 - 2,  0 - 3,  0 - 4
2nd Iteration: 1 - 2,  1 - 3,  1 - 4
3rd Iteration: 2 - 3,  2 - 4
4th Iteration: 3 - 4

现在如果在每次迭代中添加所有操作总数,则确切地说 10 (4 + 3 + 2 + 1)这是N个数的和,其公式为 N(N + 1)/ 2 (基本数学),但在我们的示例中这里N的大小不是数组的最后一个索引,大小为1,所以这里 N N-1

因此,如果在 N(N + 1)/ 2

中替换 N = N-1 ,我们会得到类似的结果

=&GT; (N-1)(N-1 + 1)/ 2

=&GT;的 N(N-1)/ 2

同样适用于Bubble和Insertion排序。那么为什么那些排序算法的效率被认为是n ^ 2和注意n(n-1)/ 2?

当size = 5时,如果我们考虑n ^ 2,我们会得到25,但考虑到n(n-1)/ 2时只得到10?为什么/如何n ^ 2在这里仍然被视为效率?

3 个答案:

答案 0 :(得分:1)

在big-O表示法中,只有最重要的术语计数,而常量系数被忽略:

O[n(n-1)/2] = O[n²/2 + n/2] = O[n²/2] = O(n²)

答案 1 :(得分:1)

在big-O表示法中,你总是采用上限,因此贡献更多的术语,例如,n个多维数据集被提升为一个大数字将比同一个数字的n个方块发挥更大的作用,因此你忽略低阶条款,因此在以大写符号提及顺序时不提及。

答案 2 :(得分:0)

你问题中的陈述并不十分准确。它不是 n 2 ,而是Θ(n 2 ,即增长的东西与 n 2 的顺序相同。

您的上述分析符合它。足够大的 n

n(n - 2)/2≤2n 2 ,所以 O(n 2

n(n - 2)/2≥n 2 / 4 ,因此Ω(n 2