假设我有一个降序数组(最坏情况场景),如:
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在这里仍然被视为效率?
答案 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 )