我必须开发一种能够对n元素列表进行排序的算法,其中第一个(n-根(n))元素被排序。是的,这是一个家庭作业问题。
在互联网和research上的一些stack-overflow之后,我认为插入排序和冒泡排序最适合部分排序的数组。这个link清楚地表明插入排序比合并排序更好。我把插入排序作为我作业的答案。
然而,当我开始进行渐近复杂性分析时,我感到困惑。
对于插入排序,我们至少要看一下每个元素。如果元素处于未排序状态,我们将不得不进行移位/反转。因此,插入排序将具有O(n + m),其中m是总反转。或者,我们也可以说它具有线性复杂度O(n)。
对于合并排序,我们需要对未排序的根(n)元素执行mergesort,这将给出root(n)log(root(n))复杂性。此外,我们需要与排序列表(将采用O(n))合并。因此,复杂性将是O(root(n)log(root(n))+ n)或O(n),因为n支配root(n)log(root(n))。
为什么两者都具有相同的渐近复杂度?这只是我的好奇心。我可能在复杂度计算的中间某处弄错了。
我是学生,还在学习。我感谢任何帮助。感谢。
答案 0 :(得分:1)
此列表中的总反转计数可能与(n - Sqrt(n))* Sqrt(n)= O(n 3/2 )一样高。
示例:100个元素列表(10 11 12..99 100 1 2 3 4 5 6 7 8 9 10)具有反转计数900,因此插入排序将执行大约900个操作(每个尾部元素90个移位)< / p>