与其他排序算法相比,为什么插入排序如此之快?

时间:2017-03-09 14:28:07

标签: python algorithm sorting quicksort insertion-sort

我一直在测试各种其他排序算法(Selection,Quick,Bubble,Shell,Radix等)的速度以及Insertion Sort。但是,Insertion Sort似乎是迄今为止最快的算法。我一直以为Quick Sort会是最快的。

这是我在Python 3中插入排序和计时器函数的代码。

def InsertionSort(argShuffledList):
    for index in range(1,len(argShuffledList)):

        currentvalue = argShuffledList[index]
        position = index

        while position>0 and argShuffledList[position-1]>currentvalue:
            argShuffledList[position]=argShuffledList[position-1]
            position = position-1

        argShuffledList[position]=currentvalue
    return argShuffledList

def Timer(argFunction, *args): ## function for timing functions
    dblStart = time.clock()
    argFunction(*args)
    intTime = "%.2f" % ((time.clock() - dblStart) * 1000000)
    message = "Elasped Time: " + str(intTime) + " microseconds"
    return message

insertionSortList = InsertionSort(insertionCopyList) 
timeInsertionSortList = Timer(InsertionSort, insertionCopyList)

3 个答案:

答案 0 :(得分:2)

您在对计时进行排序之前对列表进行排序。因此,当您计时时,列表已经排序,您的插入排序不需要插入,因此以线性时间运行。

insertionSortList = InsertionSort(insertionCopyList) 
timeInsertionSortList = Timer(InsertionSort, insertionCopyList)

目前尚不清楚第一次拨打InsertionSort的意图是什么,除非您尝试按时已排序的列表。

答案 1 :(得分:1)

任务的“最佳”排序取决于许多标准,包括数据类型,项目数量,数据分布等。

项目数量很重要,因为较简单的O(n ^ 2)排序算法的开销要小于过程效率更高的O(n lg n)算法,但是开销越少,开销就越小。分类。这就是为什么Microsoft在Visual C ++中附带的qsort的至少一个实现使用快速排序,直到给定的分区有七个或更少的项目,此时分区使用插入排序进行排序。

插入排序比其他一些O(n ^ 2)排序算法更快,因为它的开销较小(特别是与冒泡排序相比)。

排序算法也有各种变化。例如,双分区快速排序比最复杂的三分区快速排序具有更差的最坏情况性能,特别是如果数据已经按逆序排序。

Radix sort是一种特殊的排序,其性能很大程度上依赖于数据类型。最好在数据项是固定宽度时使用,并且可以利用这个事实,这使得它非常适合排序整数列表,但不能用于排序一般字符串列表。我见过有人做过的工作,使其有效地进行排序(32位)浮点数,但它确实大量利用了浮点数的内部存储。

答案 2 :(得分:0)

它实际上取决于您使用的列表类型:即使Insetrion Sort's最坏情况时间为O(n 2 ),它也是一个近似值,意味着它不适用于小的或近乎排序的列表。

由于所有递归函数,

Quick sort使用额外开销。这就是为什么你应该Insertion sort优先考虑这个鸿沟,并在问题很小时征服排序算法,例如merge sortquick sort