博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python插入排序算法总结
阅读量:5158 次
发布时间:2019-06-13

本文共 2202 字,大约阅读时间需要 7 分钟。

插入排序算法总结:

插入算法的核心是 每次循环到一个数时,都认为这个数之前的数列都是排好序的,将一个数插入到已经排好序的有序数列中,从而得到一个新的、个数加一的有序数列。

过程:从第一个元素开始,第一个数肯定是有序的,把第二个数和第一个数相比,插入到合适的位置,这样前两个数就是有序的了,接着,把第三个元素插入到前面包含两个元素的有序列表中,依次类推,知道插完第n个数据。

 

第一步:拿一个有序数列为基础,后边加一个数,实现插入排序的逻辑

a=[3,5,8,10,6]

 

代码

#encodjng=utf-8

 

a=[3,5,8,10,6]

print a

index=len(a)-1

for j in range(index-1,-1,-1):

    print "j:",j

    if a[j+1] < a[j]:

        a[j+1],a[j]=a[j],a[j+1]

        print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

        print " a:",a

    else:

        break

 

print a

       

执行过程:

 

D:\test>python test.py

[3, 5, 8, 10, 6]

j: 3

a[j+1] < a[j]: 10 < 6

 a: [3, 5, 8, 6, 10]

j: 2

a[j+1] < a[j]: 8 < 6

 a: [3, 5, 6, 8, 10]

j: 1

[3, 5, 6, 8, 10]

可以看到,默认列表前4个数3,5,8,10是从小到大排好序的,然后j从10的坐标3向前遍历到3的坐标1;

当j为3时,用j坐标后边的值(6)和j坐标的值做对比,如果6小(j[j+1] < a[j]),把6和j坐标的值交换;

当j为2时,用j坐标后边的值(还是6,因为6已经换到这儿了),如果6小(j[j+1] < a[j]),把6和j坐标的值交换;

以此类推,就间接的实现了程序的逻辑:用新的数从后往前依次和前面的排好序的数列对比,小于的话就放到前边,类似冒泡排序的反过程,之所以说是间接,是因为对比的过程并不是用新的数6和依次和前边的数做对比,而是用a[j+1]和a[j]这种取坐标的方式作对比,只不过这种下标的方式取得结果看上去是用6和前面的数依次做对比。所以,同一种算法思路可能会有多种实现方式,这里,也可以用临时变量的形式实现直观的用6和前边的数作对比,以后尝试实现。

 

第二步:将列表的所有元素按照步骤一的逻辑实现

代码:

#encodjng=utf-8

 

a=[9,2,5,1,0,4]

print a

index=len(a)-1

for i in range(index):

    print "i:",i

    for j in range(i,-1,-1):

        print "j:",j

        if a[j+1] < a[j]:

            a[j+1],a[j]=a[j],a[j+1]

            print "a[j+1] < a[j]:","%s < %s"%(a[j+1],a[j])

            print " a:",a

        else:

            break

 

    print a

       

执行过程:

D:\test>python test.py

[9, 2, 5, 1, 0, 4]

i: 0

  j: 0

  a[j+1] < a[j]: 9 < 2

  a: [2, 9, 5, 1, 0, 4]

[2, 9, 5, 1, 0, 4]

i: 1

  j: 1

  a[j+1] < a[j]: 9 < 5

  a: [2, 5, 9, 1, 0, 4]

  j: 0

[2, 5, 9, 1, 0, 4]

i: 2

  j: 2

  a[j+1] < a[j]: 9 < 1

  a: [2, 5, 1, 9, 0, 4]

  j: 1

  a[j+1] < a[j]: 5 < 1

  a: [2, 1, 5, 9, 0, 4]

  j: 0

  a[j+1] < a[j]: 2 < 1

  a: [1, 2, 5, 9, 0, 4]

[1, 2, 5, 9, 0, 4]

i: 3

  j: 3

  a[j+1] < a[j]: 9 < 0

  a: [1, 2, 5, 0, 9, 4]

  j: 2

  a[j+1] < a[j]: 5 < 0

  a: [1, 2, 0, 5, 9, 4]

  j: 1

  a[j+1] < a[j]: 2 < 0

  a: [1, 0, 2, 5, 9, 4]

  j: 0

  a[j+1] < a[j]: 1 < 0

  a: [0, 1, 2, 5, 9, 4]

[0, 1, 2, 5, 9, 4]

i: 4

  j: 4

  a[j+1] < a[j]: 9 < 4

  a: [0, 1, 2, 5, 4, 9]

  j: 3

  a[j+1] < a[j]: 5 < 4

  a: [0, 1, 2, 4, 5, 9]

  j: 2

[0, 1, 2, 4, 5, 9]可以看到,核心还是第一步实现的逻辑(第二层循环);

当i从第一个数的坐标(0)便利到最后第二个数的坐标(len(a) -1 -1),j就从坐标i往回遍历到坐标0;

然后用j+1坐标的值和前边的j坐标的值作对比,如果小于,就挪到前边,不小于就跳出;

这样插入的逻辑就从第一个数执行到最后一个数,整个排序算法就执行完了

转载于:https://www.cnblogs.com/xiaxiaoxu/p/9574336.html

你可能感兴趣的文章
修改电脑hosts文件
查看>>
#TS# get/set
查看>>
移动端开发模式
查看>>
红黑树原理、AVL树区别
查看>>
MySQL->索引的维护[20180504]
查看>>
第三章知识梳理
查看>>
在windows下安装dig工具
查看>>
django返回json格式的数据的方法
查看>>
Python使用struct处理二进制(pack和unpack用法)
查看>>
Enterprise Library6.0之缓存模块
查看>>
Red and Black
查看>>
ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
查看>>
Vue-cli 工具 / 通过 Vue-cli 工具重构 todoList
查看>>
如何用js实现页面跳转
查看>>
数据库重点复习(sql基础语句,游标,索引,视图)
查看>>
算法导论之堆排序
查看>>
特殊条件的二分查找
查看>>
【Python实践-2】求一个或多个数的乘积
查看>>
Silverlight之InitParams
查看>>
Apache vs Lighttpd vs Nginx对比
查看>>