我已经阅读了关于选择/插入/ shell排序算法的书,并且根据本书,通常,选择排序比插入排序慢,这比shell排序慢。但是,我只使用Python运行了一些测试,发现选择排序是最快的!我无法弄清楚为什么,我能想到的唯一原因是列表元素之间的交换太多了。
这是我用于测试的代码:
import random
import time
lst = [ random.randint(1,10000) for _ in xrange(10000) ]
def timeit(f):
def wrapper(*args):
t1 = time.time()
result = f(*args)
t2 = time.time()
print 'time: %f' %(t2 - t1)
return result
return wrapper
@timeit
def selectionSort(lst):
for i in xrange(len(lst)):
minNum = lst[i]
for j in xrange(i+1, len(lst)):
if lst[j] < minNum:
minNum = lst[j]
lst[i], minNum = minNum, lst[i]
return lst
@timeit
def insertionSort(lst):
for i in xrange(len(lst)):
for j in xrange(i, 0, -1):
if lst[j] < lst[j-1]:
lst[j], lst[j-1] = lst[j-1], lst[j]
else:
break
return lst
@timeit
def shellSort(lst):
h = 1
while (h < len(lst)//3):
h = h * 3 + 1
while (h >= 1):
for i in xrange(h, len(lst)):
for j in xrange(i, h-1, -h):
if lst[j] < lst[j-h]:
lst[j], lst[j-h] = lst[j-h], lst[j]
else:
break
h //= 3
return lst
selectionSort(lst[:])
insertionSort(lst[:])
shellSort(lst[:])
我机器上的结果如下:
[linuxfish@Arch week2]$./sortAlgorithms.py
time: 4.533489
time: 22.247762
time: 12.867564
这是我添加了两行代码后的结果,非常了不起......
time: 4.937693
time: 16.773167
time: 0.179526
排序方法改编自Robert Sedgewick的this book,我认为我实现的算法与本书的内容完全相同,尽管本书中的原始算法是用Java编写的
答案 0 :(得分:0)
查看http://bigocheatsheet.com/排序部分。和http://en.wikipedia.org/wiki/Shellsort您使用的数据似乎会导致不同的行为,因为只有选择排序是稳定的。
这是一个信息:
| Best | Average | Worst
Select Sort | O(n^2) | O(n^2) | O(n^2)
Insertion Sort | O(n) | O(n^2) | O(n^2)
Shell sort | O(nlogn) | depends on the gap | O(n^2)