算法----插入排序 python

算法是编程中最重要的一环,优秀的算法可以让程序更快,更好的完成所需的任务,在之后的博客中,算法将成为主要内容,通过学习一本出色的算法书籍,以及相关课程的学习,谈谈自己的见解~!

算法

算法就是任何良定义的计算过程,这个过程将某个值或值的结合作为输入,并产生某个值或值的集合作为输出。这样算法就是将输入变成输出的一个序列。整个系统的性能不但依赖于选择快速的硬件而且还依赖于选择有效的算法。算法是当代计算机中使用的大多数技术的核心,是否具有算法知识与技术的坚实基础是区分真正熟练的程序员与初学者的一个特征。

算法导论----插入排序

将一个打乱的数列按照从小到大的规律进行排序,这个问题经常出现,而在算法中也有很多不同的排序算法,其中一种就是插入排序。插入排序就像老师将学生从左到右,从矮到高进行排队一样,老师先排学生1,放在最左边,然后排学生2,若这个学生比学生1矮,则将学生2,插入队伍中的最左边,即学生1的左边,若这个学生比学生1高,则将学生2插入学生1的右边,这样,学生1,学生2,所排的队列就是按从左到右,从矮到高进行排列的,在已经排好的队列中,要排第三个学生,则可以用学生3与现在队列(已经排序整齐)的学生进行比较,若从最高的到最矮的顺序比较,则当学生高于队列中的一个学生时,就将其插入这个学生的右边。这样将使插入后的队列依然是正确的,即符合从左到右,从矮到高排列,后面的学生依照前面的方法进行插入,将保证插入后的队列一直保持队伍的排列规律,直至最后一个人排队结束。
插入排序的工作方式也和许多人排序一手扑克牌也很像。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。而为了找到一张牌的正确位置,我们从右到左将它与已在手中排好顺序的每一张牌进行比较。这样,在我们左手中的牌总是排序好的,当从桌子上拿走下一张牌的时候,就可以直接从右开始向左进行比较,当遇到比这张牌小的牌的时候,就可以停止,将其插入。
用伪代码可以表示为

INSERTION-SORT(A):
for j = 2 to A.length
	key =  A[j]
	while i > 0 and A[i] > key
		A[i+1] = A[i]
		i = i - 1
	A[i+1] = key

Python 实现插入排序

lista = [2,5,1,3,4]
#一个单独的数没有次序,可将列表的第一个数视为已经排序好,从第二个数字开始插入
for j in range(1,len(lista)):     #for循环确定要插入的数
    key = lista[j]
    i = j-1                      #标记插入位置,即i为key要插入的位置
    while i>=0 and lista[i]>key:
        lista[i+1] = lista[i]    # 将位置i让出,将i上的数字往后移一位
        i -=1
    lista[i+1] = key   
                            #因为while循环结束后对原本要插入的位置进行了减1操作取位置i前一位进行比较,判断是否继续循环
                            #所以当要将key插入时,加1,才能插入到原本正确的位置
print(lista)

算法流程推导:
[ 2,5,1,3,4] -->[ 1,2,5,3,4] -->[1,2,3,5,4] -->[1,2,3,4,5]
算法将按上面的推导完成排序的工作,第一次,排序的是5,排好的队列中只有一个2,与2进行比较,因为比2大,不进入while循环,因此不将2往后移动,直接插入2的右边。第二次,排序的是1,因为1比5,2都小,进入while循环,将5,2往后移一位,将1插入原本2的位置,其中while循环中的条件 i >=0,是为了限制插入的位置 i 最小只能为队列第一个,在这里即为Python列表的第一位。第三次也类似,排序的是3,因为3比5小,所以5往后移动一位,但3比2大,所以while循环终止,3插入原本5所在的位置。第四次以此类推。
在插入排序中,我们可以发现一点,for循环的每次迭代的开始,包含元素A[ 1…j-1]的子数组已经排序好了,我们把A[ 1…j-1]这些性质形式地表示为一个循环不等式
循环不等式主要用来帮助我们理解算法的正确性。关于循环不等式,我们必须证明三点
初始化:循环第一次迭代之前,循环不变式为真
for 循环第一次迭代开始时,A[ 1…j-1]只由单一元素A[ 1 ]组成,一个元素可以看成已经排序好了,表明第一次循环迭代之前,循环不变式为真
保持:如果循环的某次迭代之前,循环不变式为真,那么下次迭代之前它仍为真。
for循环体内while循环进行移位操作,空出位置并确定A[ j ]的正确插入位置,跳出while循环后,将A[ j ] 的值插入该位置,这样,数组A[1…j]由原来A[ 1…j]中的元素组成,但已经排好序列,在下一次迭代开始的时候,增加 j 的值,保持循环不变式为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于我们证明算法是正确的。
导致for循环终止的条件是 j >A.lenght = n。因为每次循环迭代 j 增加 1 ,维持循环不变式为真,当 j = n +1 时,循环终止,但循环不变式 A[ 1…j-1=n]仍然是成立的,而此时循环不变式的所有元素就是我们的需要排序的整个数组中的所有元素,但循环不变式的元素已经排序好了,所以循环不变式为真,说明整个数组中的元素已经全部排序完成。因此算法是正确的

You can’t change the past ,but you can ruin the present by worrying about the future
我们改变不了过去,但是如果你过于担忧未来,就会毁了现在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值