python 排序 按照两个字段_python排序


之前写过一个选择排序,可以先看看。


欧德飞:Python初级排序算法——选择排序zhuanlan.zhihu.com

python 排序 按照两个字段_数组_02


通常人们整理扑克牌的方法是一张一张的来,将每张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。这种算法叫做插入排序。

实现方法是使用两个嵌套的循环,第一个循环


从第二个元素开始,依次增加(向右移动),直到数组最后一个元素。第二个循环



开始,依次减小(向左移动),直到当前元素比左边的元素大或者直到数组的第二元素就退出循环,当前元素如果比前一个元素(左边的元素)小,就交换位置。如图所示:


python 排序 按照两个字段_插入排序_03

插入排序示意图

与选择排序一样,当前索引左边的所有元素都是有序的,但它们的最终位置还不确定,为了给更小的元素腾出空间,它们可能会被移动。但是当索引到达数组的右端时,数组排序就完成了。

和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。对一个很大且其中的元素已经有序(或接近有序)的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多。

Python代码如下:


import random

def insertionSort(arr):
    N = len(arr)
    for i in range(1,N):
        j = i
        while j > 0 and arr[j-1] > arr[j]:
            arr[j-1],arr[j] = arr[j],arr[j-1]
            j -= 1
    return arr

a = [i for i in range(1,11)]
random.shuffle(a)

print(a)
print(insertionSort(a))

#运行结果:
[2, 9, 5, 1, 3, 10, 6, 8, 4, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


对于随机排列的长度为


且主键不重复的数组,平均情况下插入排序需要大约


次比较以及


次交换。最坏情况下需要大约


次比较和交换,最好情况下需要


次比较和


次交换。对于大部分元素是有序的大数组,其中倒置的数量很少时,插入排序很可能比其它排序算法都快。