Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于排序算法效率的困惑_Python_Algorithm_Sorting - Fatal编程技术网

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

我读过关于选择/插入/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[:])
这是我添加了两行代码后的结果,非常令人惊讶

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