一开始并没有搞懂插入排序是怎么运作的,但是发现有点像打扑克牌整理牌时有点像,就领悟到了精髓,不多说先附上代码,问题下面再说。
插入排序
#!/usr/bin/python3
#插入排序
import random
lst=[]
for i in range(10):
lst.append(random.randint(1,100))
print(lst)
for i in range(1,len(lst)):
n=lst[i]
j=i
while n<lst[j-1] and j>=1:
lst[j]=lst[j-1]
j=j-1
lst[j]=n
# for j in range(i,-1,-1):
# if n>=lst[j-1]:
# break
# else:
# lst[j]=lst[j-1]
# lst[j]=n
print(lst)
可以看到我有注释的部分,是我用for循环做出来的,现在说起来云淡风轻,但是写这段代码时可是痛苦万分。
我先是用for循环写的,思路很容易就想到,但是bug就是改不掉,总是无法给第一个数排序,自己用纸和笔把程序过了一遍又一遍,发现了就是第二个循环条件的问题,但是那天脑子已经懵了,所以我先是用while循环做了一遍,while循环很是简单的就做了出来。
第二天早起后,利用python里有负索引这个东西,直接将内层循环的stop给到了-1,这样子索引不会超出范围,如果当前循环的i索引的数字是最小的时候,也能和0索引的数字进行互换,但是对于while循环来说这个就很容易想到,因为即使i索引所在的数是最小的时候,j-1之后直接跳出循环,i和0的数字就可以直接互换,不需要想太多。
从那以后,我写循环就会考虑while多一些了(因为水平有限,很多循环都是用for写的),还有,脑子懵了的时候千万不要写代码,只会把自己绕进去浪费时间,不如放松放松再去思考,效率会高很多。