我觉得这个比喻很好...而插入排序的基本思路就是取第一个数作为“手牌”,接下来n-1个数看作摸到的牌,所以一共要摸n-1次。所以循环n-1次完成n-1次插入,每次把无序区第一个数取出从[i]开始往前比大小这样的循环一共进行n-1次从[1]位置到[len(n)-1]位置所以循环应该写成
for i in range(1,len(li)):
拿出这个摸到的牌,和前面有序区(即手牌)的最后一项开始向前比大小以找到插入位置。
就比如说我抽到了6这张牌,和7比,比7小,那么将7右移一格
然后将6与5比大小,发现6比5大,就直接把6插入空位即可。这边要注意此时检索的j所表示的是“5”这个位置的下标,于是要在j+1的位置插入6。
下面都同理
时间复杂度为O(n2)
这边说明一下,我发现这个学习视频的代码好像完全照搬会有问题因为有时候他没有return却能输出,且@cal_time在我的python3.0里面好像不能用只能用time替代(详情请见4.快速排序),以下是我的程序:
def insert_sort(li):
for i in range(1,len(li)):
tem=li[i]
j=i-1
while j>=0 and li[j]>=tem:
li[j+1]=li[j]
j-=1
li[j+1]=tem #在每次while之后j的值比刚刚完成的位子已经左移一格,所以+1
return li
li1=[2,3,6,8,9,7,4,5,1]
print(insert_sort(li1))
部分图片参考自b站IT编程界的扛把子的python算法学习视频,本文仅供个人学习使用,特此声明