【问题标题】:Why efficiency of selection sort or Bubble or Insertion sort is said to be n^2 and not as n(n-1)/2为什么选择排序或冒泡或插入排序的效率被称为 n^2 而不是 n(n-1)/2
【发布时间】:2016-09-26 20:57:08
【问题描述】:

假设我有一个递减数字数组(最坏情况),例如:

Nums = {50,40,30,20,10}(大小 = 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 不是它的最后一个数组索引的大小,它是 size-1 所以这里 N 将是 N-1

因此,如果在 N(N+1)/2 中替换 N=N-1,我们会得到类似的结果

=> (N-1)(N-1+1)/2

=> N(N-1)/2

冒泡排序和插入排序也是如此。那么为什么说这些排序算法的效率是 n^2 并注意 n(n-1)/2 呢?

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

【问题讨论】:

标签: algorithm performance sorting big-o


【解决方案1】:

在大 O 表示法中,只有最重要的项才计数,而常数系数被忽略:

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

【讨论】:

  • 我认为你最右边的表达式有错字(我猜你的意思是 O(n^2))。
  • 感谢@AmiTavory 告诉我!已更正。
【解决方案2】:

在 big-O 表示法中,您总是取上限,因此贡献更多的项,例如,n 立方乘以一个大数将比 n 平方对相同数字发挥更大的作用,因此您忽略低阶项,因此在使用 big-o 表示法提及顺序时不要提及 then。

【讨论】:

    【解决方案3】:

    您问题中的陈述并不十分准确。不是说n2,而是说Θ(n2),即生长的东西与 n2 的顺序相同。

    你上面的分析很符合。对于足够大的n

    n (n - 2) / 2 ≤ 2 n2,所以是O(n2) em>,

    但是n(n-2)/2≥n2/4,所以是Ω(n2) .

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2013-01-28
      • 1970-01-01
      • 2014-10-26
      • 2015-09-12
      • 1970-01-01
      • 2021-04-20
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多