我一直在测试各种其他排序算法(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)
答案 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 sort
和quick sort
。