python插入排序算法总结
插入排序算法总结:
插入算法的核心是 每次循环到一个数时,都认为这个数之前的数列都是排好序的,将一个数插入到已经排好序的有序数列中,从而得到一个新的、个数加一的有序数列。
过程:从第一个元素开始,第一个数肯定是有序的,把第二个数和第一个数相比,插入到合适的位置,这样前两个数就是有序的了,接着,把第三个元素插入到前面包含两个元素的有序列表中,依次类推,知道插完第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插入排序算法总结的更多相关文章
- Python—插入排序算法
# 插入排序,时间复杂度O(n²) def insert_sort(arr): """ 插入排序:以朴克牌为例,从小到大排序.摸到的牌current与手里的每张牌进行对比 ...
- python --- 插入排序算法
先上一张图,看看能不能从里面悟出些什么: 问题的解决思路: 就是当插入第i个的时候,前面的[i- 1]个已经排好了,这时候lst[i]就倒过来逐个和前面的关键字顺序进行比较,找到插入位置即将lst[i ...
- 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现
排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...
- python实现排序算法(一)——插入排序算法
''' 插入排序算法 原始数据data 排序数据后数据SortedData,默认是从小打大排序 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被 ...
- 史上最详细的C语言和Python的插入排序算法
史上最详细的C语言和Python的插入排序算法插入排序原理:所谓插入排序,就像我们在打牌(斗地主)时,整理我们自己手中自己的牌一样,就像是2,1,3,9,J,K,5,4,这四张牌.我们要把它其中的几张 ...
- python算法与数据结构-插入排序算法(34)
一.插入排序的介绍 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我 ...
- Python 基础算法
递归 时间&空间复杂度 常见列表查找 算法排序 数据结构 递归 在调用一个函数的过程中,直接或间接地调用了函数本身这就叫做递归. 注:python在递归中没用像别的语言对递归进行优化,所以每一 ...
- Python排序算法——希尔排序(Shell’s Sort)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
随机推荐
- 涨知识,涨知识 :ThinkPHP框架下Where条件查询Mysql数据库某字段是否为空
代码虐我千百遍,我对代码如初恋~ 问题: 查询某字段app_date数据是否为NULL,正常我们实现的办法是: $map['app_data'] = array('eq','null'); $data ...
- 记一次Castle报错
CJXX.ServiceTest.PersonRelationMgeSvrTest.GetPersonRelation:SetUp : Castle.MicroKernel.ComponentActi ...
- 【转】.NET 应用程序是怎么运行的
原文:http://www.cnblogs.com/xishuai/p/mono-dotnetcore.html .NET应用程序运行过程 C#程序运行过程 CLR结构
- POJ 1849 - Two - [DFS][树形DP]
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...
- Gym - 101149K Revenge of the Dragon 脑洞题,样例题
http://codeforces.com/gym/101149/problem/K 题意:题目贼长,但其实是个脑筋急转弯... 题解:题目要求某图形面积.该图形只有一个自由度,就是起点与终点距离x. ...
- 停机问题(英语:halting problem)是逻辑数学中可计算性理论的一个问题。通俗地说,停机问题就是判断任意一个程序是否能在有限的时间之内结束运行的问题。该问题等价于如下的判定问题:是否存在一个程序P,对于任意输入的程序w,能够判断w会在有限时间内结束或者死循环。
htps://baike.baidu.com/item/停机问题/4131067?fr=aladdin 理发师悖论:村子里有个理发师,这个理发师有条原则是,对于村里所有人,当且仅当这个人不自己理发,理 ...
- HTML5 Storage(永久存储)
localStorage.aa="aa"; //存储了一个key为aa并且value为aa的键值对: localStorage.setItem("bb", &q ...
- C++三大特性之封装
原文地址:https://qunxinghu.github.io/2016/09/12/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%B ...
- Django的调试方法
web程序调试起来和桌面程序有着很大的差别,对于Django程序来说调试更是个问题.我们可以用postman发送http请求,下面就介绍几种调试方法: 1.在Eclipse+Pydev中调试Djang ...
- Django中配置用Redis做缓存和session
django-redis文档: http://django-redis-chs.readthedocs.io/zh_CN/latest/# 一.在Django中配置 # Django的缓存配置 CAC ...