思路:
插入排序就像打扑克牌,从第一张牌开始,每抽一张牌,我们会把它与前面的牌比较,放到合适的位置。
针对无序列表,我们从第一个数开始,向后续列表逐个抽取数字,每抽取一个数字就保存该数字为tmp,然后逐个与前面的数字进行比较,若tmp大于前一个数字那就将tmp插入其后面,本次插入结束,开始抽取下一个数字进行比较插入;若tmp小于前一个数字那就将前一个数字后移一位,tmp继续向前比较,直到前面无数字就插入第一个位置,本次插入结束,开始抽取下一个数字。
直到抽取完列表最后一个数字插入结束,排序完成。
下图为排序示例:
以此类推,直到抽取完最后一个数字,插入完毕即为有序。
实现代码:
def InsertSort(li):
for i in range(1, len(li)): # 从第一个位置开始向后抽取数字
tmp = li[i] # 暂时保存数字
j = i-1 # 前一个位置
while j>=0 and tmp < li[j]: # 当前一个位置下标不小于0 并且 tmp小于前一个位置的数时
li[j+1] = li[j] # 把前一个数后移一位
j = j-1 # 继续向前比较
li[j+1] = tmp # tmp不小于前一个数时,插入其后面
li = [2, 1, 4, 6, 3, 5, 9, 7, 8]
InsertSort(li)
print(li)
排序过程如图所示: