[排序N大件之]插入排序

整理过扑克牌吗?这个排序和你整理扑克牌完全一样!

我们总是挑选一张牌作为基准,然后决定剩下的牌该插到对于这张牌来说哪个合适的位置:

从第二张开始,如果牌比他小,那么第二张牌就插到他的前面,如果比他大,那就先不变

从第三张开始,一次与前面两张比较,如果都比第三张牌大,那之前两张牌总是要往后捣腾位置,然后把这张牌插到空出来的那个位置上。

插入排序的外层循环:for i in range(1, n)

表示要一共要整理的元素,从第二个元素开始,因为我们总是取第一个数作为参照

保存现场

当前整理到的数,我们要把这个数所有的信息保存起来,下标和值,都要作为内层循环的参照

  • 下标决定了前面已经排好序的元素一直往后捣腾,知道找到一个小于这个元素的值停止
  • 在他之前的每个元素都要进行比较,表示在这个数之前的元素什么时候要往后捣腾

最后捣腾完了(内层循环结束),把这个抽出来的元素插入到捣腾后空出来的位置

def insertionSort(nums):
    n = len(nums)
    for i in range(1,n):
        cur = nums[i]
        position = i
        while position > 0 and nums[position - 1] > cur:
            nums[position] = nums[position - 1]
            position = position - 1

        nums[position] = cur

    return nums


if __name__ == "__main__":
    numbers = [3, 7, 5, 4, 8, 9, 6, 2, 1]
    print(insertionSort(numbers))

时间复杂度:O(n2)

插入排序也有一个最好的情况:当所有的元素已经从小到大排好序之后,只需要完成一次遍历整个列表就可以了,并不需要移动元素的位置

空间复杂度:O(1)

原文地址:https://www.cnblogs.com/canaan233/p/13719325.html