今天对插入排序发进行了学习,首先我们需要理解插入排序法的基本概念以及做法:
插入排序法原理视频
在我们对插入排序法进行了解之后,我们便要开始我们的工作。首先我们有一个外循环,要负责记录我们当前排序的数值,一个内循环负责比较,将该数值与该数值之前的数值进行比较确定位置。
首先我们可以从视频中发现,如果我们需要插入一个数据,我们需要将该数据到需要插入位置之间的数据全部后移。
即:
那么问题来了,我们需要如何将数据后移?
其实过程很简单
A = [1,4,5,6,3,8,9,10]
A[7] = A[6]
A[6] = A[5]
A[5] = A[4]
A[4] = A[3]
A[3] = A[2]
A[2] = A[1]
移动完后的列表应该是[1,4,4,5,6,3,8,9]
我们发现,我们需要移动的数字10去哪里了?
在A[7] = A[6]的时候,数字10便被覆盖了,所以我们在移动前需要保存A[7]的数值!
A = [1,4,5,6,3,8,9,10]
key = A[7]/*我们需要移动的数据*/
A[7] = A[6]
A[6] = A[5]
A[5] = A[4]
A[4] = A[3]
A[3] = A[2]
A[2] = A[1]
A[1] = key /*对对应的数据赋值*/
接下来我们对代码进行优化
A = [1,4,5,6,3,8,9,10]
key = A[7]
for i in range(7,0,-1):
A[i] = A[i-1]
i = i - 1
A[i] = key
或者
A = [1,4,5,6,3,8,9,10]
key = A[7]
for i in range(6,0,-1):
A[i+1] = A[i]
i = i - 1
A[i+1] = key
两种方法的区别只是两边的谁用i来替代
接下来,因为我们数字其实比较少,我们可以很轻松的计算出移动次数。但是如果有几千个数据需要你来排序,你知道移动几次吗?实际上我们应该是不知道移动次数,而是知道什么时候停下来(前面的数字比我们需要移动的数字大)。所以我们需要对代码进行改造
A = [1,4,5,6,3,8,9,2]
key = A[7]
i = 6
while A[i]>key:
A[i+1] = A[i]
i = i - 1
A[i+1] = key
为什么i要为6呢?
因为我们要移动的是7号位,但是如果i=7,就是自己和自己比较,这样是没有必要的,所以我们需要i=6.
但是如果列表是这样的呢?
A = [1,4,5,6,3,8,9,2,0]
我们的0需要移动到最前面,那同样的代码可以实现这个功能吗?
实际上我们是有问题的!你将i打印出来你就会发现,这个下标的数值有些奇怪!它会超过0,按道理来说我们只需要到0即可。所以我们需要对代码进行修改!
A = [1,4,5,6,3,8,9,2,0]
key = A[7]
i = 6
while A[i]>key and i>=0:
A[i+1] = A[i]
i = i - 1
A[i+1] = key
OK,到这里我们已经基本完成了一次排序。接下来我们需要完成全部数据的排序,让我们对代码进行修改!
首先我们要明白在这里key的作用是什么,i的作用是什么!
在这里我们的key用来保存我们需要移动的数据
i的作用是需要移动的数据的下标!
A = [1,4,5,6,3,8,9,2,0]
for j in range(1,len(A)-1):
key = A[j]
i = j-1
while A[i]>key and i>=0:
A[i+1] = A[i]
i = i - 1
A[i+1] = key
对该区间进行比较并排序实现了插入过程
目前也是正在学习中,应该有更简单的做法
以上做法实际上也只是对区间进行排序
真要说插入排序法应该如下:
a = [2,6,9,7,3,5,1,4]
for i in range(1,len(a)):
key = a[i]
j = i - 1
while(a[j]>key and j >=0):
a[j+1] = a[j]
j = j - 1
a[j+1] = key
print(a)
其实该算法就是分为两步来走,第一步先将对应的数据前移,第二布遍历所有的数据重复第一步的做法。