【问题标题】:Making "Insertion sort" algorithm more efficient - Python 3.5.2使“插入排序”算法更高效 - Python 3.5.2
【发布时间】:2017-11-12 03:11:52
【问题描述】:

我尝试在 python 中编写插入排序算法 -

def insertion(list):
    checked = 2
    while (checked <= len(list)):
        for i in range(checked-1):
            if list[checked-1] < list[i]:
                list.insert(i, list[checked-1])
                del list[checked]
        checked+=1
    return list

我测量了执行 1000 项排序所需的时间 - 106.08099999999997 千分之一秒

我发现这很慢,因为 -

def bubbleSort(alist,n):
    for j in range(1,n):
        nextnum = alist[j]
        i = j - 1
        while i>=0 and alist[i]>nextnum:
            alist[i + 1] = alist[i]
            i = i - 1       
        alist[i + 1] = nextnum

只拿了- 83.71800000000007 千分之一秒

有什么方法可以让我的代码更高效/我必须使用不同的代码吗?如果是这样,哪个插入排序实现在 python 中是最快的?我知道插入排序通常不是最好的算法。这只是为了我的学校作业,以便我可以更好地理解我们学习的算法。

【问题讨论】:

  • 1.你是如何“测量”的?你用timeit 做的正确吗? 2. 如果你想要一个高效的排序算法,不要使用 O(n^2) 算法:使用合并或快速排序。如果你知道数字的范围,你也许可以使用基数或桶排序来实现线性时间
  • 我刚刚使用了 time.clock()。它可能不准确,但这只是为了证明它比其他代码慢。同样,正如我在底部所说的,这只是为了学校工作。我不是在寻找最有效的算法,但感谢您的建议。

标签: algorithm python-3.x optimization insertion-sort


【解决方案1】:

从列表中插入和删除比仅交换位置的内容更昂贵。这比冒泡排序更快:

def insertion(M):
    for i in range(1,len(M)):
        for j in range(i):
            if M[i] < M[j]:
                M[j],M[j+1:i+1] = M[i],M[j:i]
                break

请注意,这使用a,b = b,a 的“交换”语法,它将检查的值交换到插入位置,并将剩余值交换到列表中的前一个位置。此外,一旦进行交换,请从内部循环中中断。无需继续检查插入位置。您还可以使用以下方法检查要交换的值是否已经大于或等于先前排序的值,并在为 true 时跳过内部循环:

def insertion(M):
    for i in range(1,len(M)):
        if M[i] >= M[i-1]:
            continue
        for j in range(i):
            if M[i] < M[j]:
                M[j],M[j+1:i+1] = M[i],M[j:i]
                break

【讨论】:

  • 我明白了,这很有帮助,非常感谢!我想我可以应用这些技术来让我的其他算法也更高效!更新 - 您将时间缩短到原来的 40%!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多