来自b站视频
算法原理
通过构建有序序列,对于未排序数据,在已排序序列中向前扫描,找到相应位置并插入。在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
需要两层循环。
第一层循环(j):表示从右边的无序序列中取出元素的过程。1~n-1 range(1,n)
第二层循环(i):从右边的无序序列中取出第一个元素,然后与前面的有序序列进行比较,放入正确的位置中。i>0
动图演示
具体实现
def insertsort(alist):
n = len(alist)
for j in range(1, n): # 表示从右边的无序序列中取出元素的过程,1~n-1
i = j
while i > 0: # 从右边的无序序列中取出第一个元素,然后与前面的有序序列进行比较,放入正确的位置中
if alist[i] < alist[i-1]:
alist[i], alist[i-1] = alist[i-1], alist[i]
i -= 1
else:
break
# for i in range(j, 0, -1):
# if alist[i] < alist[i-1]:
# alist[i], alist[i-1] = alist[i-1], alist[i]
测试
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print('原序列:', li)
insertsort(li)
print('排序后:', li)
[54, 26, 93, 17, 77, 31, 44, 55, 20]
原序列: [54, 26, 93, 17, 77, 31, 44, 55, 20]
排序后: [17, 20, 26, 31, 44, 54, 55, 77, 93]