插入排序
原理
# 插入排序的原理就好比我们打牌时,需要将摸到的牌按照顺序放的时候,那种排序的原理。
# 手里的牌肯定都是已经排序好的。摸到一张新牌时,判断这张新牌放在哪个合适的位置。
# 在列表排序中,就是将无序区的数依次取出来,和有序区的数字比较,确定合适的位置,然后将这个数字插进去。
# 默认列表第一个位置上的数是手里的牌(有序区)。后面的数是都是将要摸到的新拍(无序区)
代码实现
插入排序时间复杂度:O(n^2)
# -*- coding: utf-8 -*-
# created by X. Liu on 2020/3/9
def insert_sort(li):
for i in range(1, len(li)): # i是将要插入的数字的索引,从1开始,直到列表最后一个数
tmp = li[i] # 这里需要将手里的牌先保存下来,避免寻找合适位置时把这个数覆盖掉
j = i - 1 # j 初始是有序区最大的那个数的索引,也就是i前面那个
while j >= 0 and li[j] > tmp:
li[j+1] = li[j] # 满足条件时,将有序区的数字往右移目的是腾出空位放tmp
j -= 1 # 再将j 往左移位,准备判断有序区第二大的数字和tmp的大小
li[j+1] = tmp # 退出循环表示找到了合适的位置
return li
# while循环的目的是为了确定插入tmp的位置
# 循环条件:
# (1) j>=0: 判断的是当j=-1,此时表示刚摸到的那个数,比有序区最小的数(列表第一个元素)还小,当不满足该条件时退出循环,表示已经比较大到列表的第一个位置了,此时j等于-1,应该退出循环,将摸到的数插在第一个位置,即0位置(此时,j+1=0)
# (2) li[j] > tmp,此时新摸到的那个数小于j位置上的数,j位置上应该右移。如果不满足这个条件,说明找到的合适的位置插入新数,此时还是 j+1那个位置存新数