使“插入排序”算法更有效 - Python 3.5.2

时间:2017-11-11 17:54:14

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

我尝试在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 个答案:

答案 0 :(得分: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

注意这使用&#34; swap&#34; 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