使 "Insertion sort" 算法更高效 - Python 3.5.2

Making "Insertion sort" algorithm more efficient - Python 3.5.2

我尝试在 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 中最快?我知道插入排序通常不是最好的算法。这只是为了我的学校作业,以便我更好地理解我们学习的算法。

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

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 的 "swap" 语法,它将选中的值交换到插入位置,并将剩余值交换到列表中的一个前面。此外,一旦交换完成,就从内部循环中退出。无需继续检查插入位置。您还可以检查要交换的值是否已经大于或等于先前排序的值,并在 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