【问题标题】:Confusion about the efficiency of sorting algorithms对排序算法效率的困惑
【发布时间】: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排序都实现不当。

标签: python algorithm sorting


【解决方案1】:

查看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)

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @NKN 链接没有回答问题。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2011-01-27
  • 2015-01-21
  • 2013-03-17
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多