插入排序
其基本思想是将一个数据插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。
理解思路
-
初始时手里(有序区)只有一张牌
-
每次(从无序区)摸一张牌,插入到手里已有牌(有序区)的正确位置
-
过程示意图https://www.runoob.com/data-structures/insertion-sort.html
它里面一步步演示的都很好,希望你们能看懂。
时间复杂度
- 最坏情况:O(N^2)
- 最好情况:O(N^2)
- 平均情况:O(N^2)
代码
def insert_sort(li):
for i in range(1, len(li)): # i 表示摸到的牌的下标
tmp = li[i] # 每次要抓的牌
j = i - 1 # j指的是手里的牌的下标
while j >= 0 and li[j] > tmp: # 查找插入的位置
li[j+1] = li[j] # 手中的牌比摸到的牌要大,手里牌往右移
j -= 1 # 此时手里牌下标就会相应向左移
li[j+1] = tmp # 找到插入位置后,把抓到的牌插入对应位置
print(li)
li = [3,2,4,1,5,7,9,6,8]
print(li)
insert_sort(li)
print(li)
结果为:
看上图的结果可知:
- 第一行是无序行
- 第二行时,就把手里的牌(3)作为有序区,然后与抓起来的牌(2)作比较,此时2比3小,就把2这张牌插到3前面。
- 第三行时,摸到4这张牌,与手里原有的2,3两张牌作比较,此时4比2和3都大,这时就把4放到有序区末尾。
- 以此类推…