插入排序法

今天对插入排序发进行了学习,首先我们需要理解插入排序法的基本概念以及做法:
插入排序法原理视频
在我们对插入排序法进行了解之后,我们便要开始我们的工作。首先我们有一个外循环,要负责记录我们当前排序的数值,一个内循环负责比较,将该数值与该数值之前的数值进行比较确定位置。

首先我们可以从视频中发现,如果我们需要插入一个数据,我们需要将该数据到需要插入位置之间的数据全部后移。
即:插入前的列表
插入后的列表
那么问题来了,我们需要如何将数据后移?
其实过程很简单

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)

其实该算法就是分为两步来走,第一步先将对应的数据前移,第二布遍历所有的数据重复第一步的做法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值