十大算法之三之插入排序
插入排序原理
插入排序区别于冒泡一位一位的去交换位置,也区别于选择排序的比对,对
于其他人用插扑克牌比较,我更习惯于用在体育课上排队解释,先找位置后插人(此图来源于博客园 —像
素)在体育课刚开始的时候,假如我们不去按身高排,就相当于原始数据然后开始进行排序
- 赋值思路 (为了方便理解代码程序 我直接将代码里面的元素在这赋予意义,只是个人声明,朋友们可以自己换。)
因为要产生对比,我们直接从第二位开始比较第一位,抽出第二位,此时就会产生一个空位,在外面给二号位一个容身之地,我们将取出来在外面要和其他比较的这个地方的位置称作 i赋值为num每次循环的i代表的其实就是到第几个数该进入循环了
则我们可以将列表lst[i]赋值给num 可得 num=lst[i]
找位置(我做的是从小到大)
我们用for循环循环j
值用来保存元素应该插入的位置,注意,一定要注意lst[j]表示的一定是位置而不是数值如果发现我们的num
值比他的前一位也就是lst[j-1]
小,那么我们把我们的lst[j]
的位置,与他的前一位也就是lst[j-1]
去用等号交换,也就产生了lst[j] = lst[j-1]
那么他们两个的位置也就发生了交换。
但如果num
大于或等于我们的lst[j-1]
我们完全可以用else
概括这种情况,只要跳出这个if
语句就行
最后赋值
找完位置以后,我们就可以把我们num
的值给我们的lst[j]
了,给lis[j]
赋予一个灵就是num
lst[j]=num
然后我们输出打印list就行
这下就可以写出我们的代码
1 #!/usr/bin/python3 2 #插入排序 3 lst = [1,9,8,5,6,7,4,3,2] 4 print('这是原数组',lst) 5 for i in range(0,len(lst)): 6 num = lst[i] 7 for j in range(i,-1,-1):#j 保存元素的应该插入的位置 8 if num < lst[j-1]: 9 lst[j] = lst[j-1]#后移 10 else: 11 break 12 lst[j]=num 13 print('这是输出后的',lst)
生成值
这是原数组 [1, 9, 8, 5, 6, 7, 4, 3, 2] 这是输出后的 [1, 2, 3, 4, 5, 6, 7, 8, 9]
总结
插入排序的交换位置容易与冒泡思想相重合,而在给num赋值那一块又和选择排序比较像,所以思路上要转过弯,希望对大家有所帮助,如有问题,私信我 ,我们互相进步
初入python ,承蒙关照