Python 关于排序算法效率的困惑
我读过关于选择/插入/shell排序算法的书,根据这本书,一般来说,选择排序比插入排序慢,插入排序比shell排序慢。然而,我使用Python运行了一些测试,结果发现选择排序是最快的!我不明白为什么,我能想到的唯一原因是列表中的元素之间有太多的交换 以下是我用于测试的代码:Python 关于排序算法效率的困惑,python,algorithm,sorting,Python,Algorithm,Sorting,我读过关于选择/插入/shell排序算法的书,根据这本书,一般来说,选择排序比插入排序慢,插入排序比shell排序慢。然而,我使用Python运行了一些测试,结果发现选择排序是最快的!我不明白为什么,我能想到的唯一原因是列表中的元素之间有太多的交换 以下是我用于测试的代码: import random import time lst = [ random.randint(1,10000) for _ in xrange(10000) ] def timeit(f): def wr
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[:])
这是我添加了两行代码后的结果,非常令人惊讶
time: 4.937693
time: 16.773167
time: 0.179526
排序方法改编自Robert Sedgewick,我认为我实现的算法与书中所说的完全相同,尽管书中的原始算法是用Java编写的。请看一下排序部分。您使用的数据似乎会导致不同的行为,因为只有选择排序是稳定的
以下是有关信息的详细信息:
|最佳|平均|最差
选择排序| O(n^2)| O(n^2)| O(n^2)
插入排序| O(n)| O(n^2)| O(n^2)
Shell排序| O(nlogn)|取决于间隙| O(n^2)
如果需要整数除法,应该使用/
。这样,即使在python3下或使用来自未来导入分部的时,表达式也会正确运行。(除了让意图更清楚。)@Bakuriu感谢你指出这一点!关于这个问题有什么见解吗?你能展示你的结果吗?那不是插入排序!一旦找到插入元素的正确位置,插入排序的内部循环应该退出。取而代之的是,你所做的比较和冒泡排序一样多。作为测试,请在已排序的列表上尝试:在这种情况下,插入排序应该是O(n),但您的版本仍然是O(n^2)。似乎插入和shell排序都未正确实现。虽然此链接可能会回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则“仅链接”答案可能无效。@NKN链接不会回答问题。
time: 4.937693
time: 16.773167
time: 0.179526