插入排序
列表被分为有序区和无序区两个部分。最初有序区只有一个元素。
每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。
【就好比打牌,摸牌,手里的牌是有序的,桌子上的牌是无序的,从桌子上最上面摸一张牌,插入到手里的牌里面】
代码关键点:
- 摸到的牌
- 手里的牌
图一: 红色有序区, 白色无序区
图二: 从无序区拿出一个值
图三:
图四: 插入到有序区
python代码实现:
li = [1, 2, 3, 7, 5, 9, 4, 8, 1] def insert_sort(li): for i in range(1, len(li)): # 第一个位置的值初识化为有序区,索引从1开始 temp = li[i] # 把无序区第一个位置的值拿出来(新摸到的一张牌) j = i - 1 # 有序区最后一个位置的索引 while j >= 0 and temp < li[j]: # 两个终止条件: 1.j<0,索引越界,说明temp是最小的 li[j + 1] = li[j] # 把有序区最后一个位置的值往后移一格 j -= 1 li[j + 1] = temp # 两个终止条件: 1. j=-1,说明temp最小,放到最前面 # 2. 一上来,无序区第一个值就大于有序区最后一个值 insert_sort(li) print(li)
时间复杂度:O(n2)
空间复杂度:O(1)
优化空间:应用二分查找来寻找插入点(并没有什么卵用)
注意while j >= 0 and temp < li[j]: 两个条件的顺序
布尔运算的短路功能
1 > 2 and 3 < 4
python做了优化, 前面不满足,后面就不判断了
不用if写一个if语句
def func(): print(11) a = 1 a < 0 and func() a > 0 and func() # 11