【发布时间】:2014-11-14 19:09:09
【问题描述】:
我读过关于选择/插入/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 编写的
【问题讨论】:
-
如果你想要整数除法,你应该使用
//。这样,即使在 python3 下或使用from __future__ import division时,表达式也会正确运行。 (除了使意图更清晰)。 -
@Bakuriu 感谢您指出这一点!关于这个问题的任何见解?
-
你能展示你的结果吗?
-
这不是插入排序!一旦找到插入元素的正确位置,插入排序的内部循环应该退出。相反,您要进行与冒泡排序一样多的比较。作为测试,在已经排序的列表上尝试:在这种情况下,插入排序应该是 O(n),但你的版本仍然是 O(n^2)。
-
看来插入和shell排序都实现不当。