【发布时间】: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 视为效率?
【问题讨论】:
-
O(n^2)和O(n*(n-1)/2)是等价的。
标签: algorithm performance sorting big-o