插入排序算法总结:

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

过程:从第一个元素开始,第一个数肯定是有序的,把第二个数和第一个数相比,插入到合适的位置,这样前两个数就是有序的了,接着,把第三个元素插入到前面包含两个元素的有序列表中,依次类推,知道插完第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坐标的值作对比,如果小于,就挪到前边,不小于就跳出;

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

python插入排序算法总结的更多相关文章

  1. Python—插入排序算法

    # 插入排序,时间复杂度O(n²) def insert_sort(arr): """ 插入排序:以朴克牌为例,从小到大排序.摸到的牌current与手里的每张牌进行对比 ...

  2. python --- 插入排序算法

    先上一张图,看看能不能从里面悟出些什么: 问题的解决思路: 就是当插入第i个的时候,前面的[i- 1]个已经排好了,这时候lst[i]就倒过来逐个和前面的关键字顺序进行比较,找到插入位置即将lst[i ...

  3. 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现

    排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...

  4. python实现排序算法(一)——插入排序算法

    ''' 插入排序算法 原始数据data 排序数据后数据SortedData,默认是从小打大排序 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被 ...

  5. 史上最详细的C语言和Python的插入排序算法

    史上最详细的C语言和Python的插入排序算法插入排序原理:所谓插入排序,就像我们在打牌(斗地主)时,整理我们自己手中自己的牌一样,就像是2,1,3,9,J,K,5,4,这四张牌.我们要把它其中的几张 ...

  6. python算法与数据结构-插入排序算法(34)

    一.插入排序的介绍 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我 ...

  7. Python 基础算法

    递归 时间&空间复杂度 常见列表查找 算法排序 数据结构 递归 在调用一个函数的过程中,直接或间接地调用了函数本身这就叫做递归. 注:python在递归中没用像别的语言对递归进行优化,所以每一 ...

  8. Python排序算法——希尔排序(Shell’s Sort)

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...

  9. python常用算法学习(3)

    1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...

随机推荐

  1. 初始react

    很久就期待学习react了,惰性,一直都没有去翻阅react的资料,最近抽空,简单的了解了一下react,先记录一下,后续慢慢的学习. 一.ReactJS简介 React 起源于 Facebook 的 ...

  2. backbone.js之Model篇 简单总结和深入(2)

    一.模型属性的一些操作方法 1.mmodel.get()  获取属性的值 2.mmodel.set('age',5) 更新单个属性的值  mmodel.set({name:'aaa',age:6}) ...

  3. 在CentOS6.8下安装Docker

    在CentOS6.8下安装Docker 一.查看系统版本 [root@localhost opt]# uname -a Linux localhost.localdomain -.el6.x86_64 ...

  4. Docker 学习应用篇之二: Docker的介绍和安装

    之前说过Docker的好处,Docker可以集装箱化的部署应用程序.那么Docker是通过什么实现的呢.要理解Docker内部构建,需要先理解Docker的四种部件 1)images:镜像,docke ...

  5. 最长上升子序列 OpenJ_Bailian - 2757 dp模板

    第一种是用以前状态更新当前状态(人人为我) 第二种是用当前状态更新以后状态(我为人人) 都是n^2代码: 对于人人为我的更新方法,可以用数据结构储存“人人”对其进行线性\二分优化. ; int a[m ...

  6. CCCC L2-018. 多项式A除以B 直接上map,然后stack处理输出

    https://www.patest.cn/contests/gplt/L2-018 题意:模拟多项式除法. 题解:短除法,初中奥数老师,高中数学老师,高数老师都讲过2333. 模拟之前,关于保存 多 ...

  7. Effective Java 目录

    <Effective Java>目录摘抄. 我知道这看起来很糟糕.当下,自己缺少实际操作,只能暂时摘抄下目录.随着,实践的增多,慢慢填充更多的示例. Chapter 2 Creating ...

  8. 2018/03/10 每日一学PHP 之 修饰符 public/private/protected

    对于面向对象 修饰符的使用是我们最常用,也是很容易忽略的小细节. 对于编程来说,把握好每一个小细节,就能构造出漂亮,优雅的程序. public 使用最多的修饰符,公共方法,允许所有访问,就像一个公交车 ...

  9. CH0201 费解的开关 枚举

    正解:枚举 解题报告: 入门傻逼题,思维难度不高代码量极小,非常适合上手 然后傻逼的我第二次看这道题的时候依然没想到解法:D 没有办法,就想着写个笔记好歹记录一下以后多复习几次就记着了趴qwq 就是, ...

  10. 【JMeter】1.9上考试jmeter测试调试

    1.打开抓包工具开始抓包,抓取录制脚本的整个过程.以方便后续确认关联参数的左右关联,搜索相关代码. 1.用badboy录制测试脚本并存为jmeter格式. 2.用jmeter打开已经保存的脚本 1.用 ...