(1)在未排序序列中,构建一个子排序序列,直至全部数据排序完成。
(2)将待排序的数,插入到已经排序的序列中合适的位置,使之在添加新元素之后,仍然是有序序列。(可以增加哨兵-表示每次待插入的元素)
(说明:图片来自马哥教育-腾讯课堂)
增加一个哨兵位,每一轮比较将待比较数放入。
哨兵依次和待比较的前一个数据比较(从右往左),大数靠右移动,找到哨兵中值的插入位置。
每一轮结束后,得到一个从开始到待比较数位置的一个有序序列。
m_list = [[3,4,9,1,5,0,3,7,0,8,2,5,1,8,6],
[5,6,3,-5,1,9,5,2,8,-6,7,4,0],
[3,0,6,8,3,5,1,7,2,0,4,6,5,0,8,3]]
nums = [0]+m_list[1] #[0]哨兵
sentinel, *origin = nums #python解包操作,将列表的第一个元素取出,把剩余的放在origin中
print(sentinel, origin)
count_iter = 0#记录迭代次数
length = len(nums)
for i in range(2,length): #从2开始 默认nums[1]是有序序列
nums[0] = nums[i]
j = i-1
count_iter += 1
while nums[j] > nums[0]:
nums[j+1] = nums[j] #依次往右移动
j -= 1
nums[j+1] = nums[0] #将哨兵插入,注意插入在右侧要加一
sentinel, *origin = nums
print(origin, count_iter)