为什么不用二进制插入插入排序被认为是最好的?
Merge sort : T(n) = n + 2*T(n/2) = O(n*log(n))
But insertion sort with binary insert : T(n) = log(n-1) + T(n-1) = O(log(n!))
and n^n > n! ; so n*log(n) > log(n!)
对于更大的n,它确实有助于提高性能。
或者我错过了什么?
请原谅我,如果我问的是一个太微不足道的问题,我是编程的新手,我只是想把事实弄清楚。
答案 0 :(得分:3)
我认为您对插入排序复杂性的估计是错误的。你没有描述你如何得到结果的细节,但似乎你忘记了插入所需的时间 - 我的意思是你需要移动排序数组的某些部分来为你插入的元素腾出空间。
在对n-1个元素进行排序后,需要O(log(n))时间来查找第n个元素的位置,并且需要O(n)(悲观)时间来移动已排序数组的一部分并为第n个元素。所以总的复杂性是
O(1 + ... + n + log 1 + ... + log n)= O(n ^ 2 + n log n)= O(n ^ 2)。
您不会通过二分搜索来改进算法,因为无论如何您必须移动部分数组(线性大小为n)。
答案 1 :(得分:1)