1、插入排序逻辑
插入排序的过程可以类比为:打扑克牌时摸完牌后按大小插入到手里的牌这个过程。
最初有一堆无序的牌
1、先从这堆无序的牌中,抽出一张,放到手里,这是手里的第一张牌;
2、再从无序牌中摸出一张,用个变量tmp存起来,然后拿手里的牌跟tmp做对比;
3、从右往左依次拿出手里的牌跟tmp对比,如果比tmp大的,就让手里的这张牌往前移动1位;
4、重复3的操作,直到没有找到比tmp大的或者手里的牌都对比完了,就让tmp插入到这个位置
2、图文解说
5就是手里的第一张牌,从无序区抽出第一张是7,7和5对比,7比5大,不做任何处理,放回去;
这时候,手里的牌就变成5和7了。
继续从无序区抽了一张牌4,4比7大,就把7往右移一位,4比5大,5也要往右移一位。
手里的牌没得对比了,就把4插入到原来5的位置。
依次类推。
3、插入排序写法
def insert_sort(li):
print('列表初始值:%s'%li)
'''我们假定列表第一个元素就是手里的牌,其他都是等待被摸的牌'''
# 从无序区摸牌,i 代表被摸的牌所处的位置
for i in range(1, len(li)):
# 先找个tmp变量把摸到的牌存起来,接下来要循环拿出手里的牌跟tmp对比
tmp = li[i]
# j代表手里牌的位置,最开始拿出手里牌最右边第一张,它的位置就是i-1
j = i - 1
# 循环拿出手里的牌跟tmp对比
# 如果当前手里还有牌没对比,并且手里的牌比摸到的牌大,
# 就循环下去,否则跳出循环
while j >= 0 and li[j] > tmp:
# 如果当前这张手里的牌比tmp大,就让它的位置往右移动1位
li[j+1] = li[j]
j -= 1 # 继续往左拿出手里的牌来对比
li[j+1] = tmp # 此时手里没有牌了或者手里的牌没有比tmp大的了,
#就让tmp插入到这个位置
print(li)
li = [3, 2, 7, 1, 5, 0, 4, 6, 9, 8]
insert_sort(li)
复杂度O(n^2)