python算法之插入排序
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。
无论什么时候,左手中的牌都是排好序的。
也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7
比10小,应该再往左插,7
比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的
,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依
次往后移动一个单元。 array_a=[12,23,11,9,5,15,13,48,37,6]
loop_num=0
swap_num=0
for index in range(1,len(array_a)): #index从1开始循环,因为从数组的第二个元素开始比较,比较数组元素个数-1次
insert_value=array_a[index] #定义1个变量,用于保存当前需插入的数组元素值
position=index #定义一个变量,用于保存需要插入数组下标位置,用于控制循环
while position>0 and array_a[position-1]>insert_value: #当position大于0表示最多放在数组的第一个位置,第二个条件表示从右向左(已经排好序的数组)比较要插入的值大小。
array_a[position]=array_a[position-1] #把排好序数组右边的值向右移动,覆盖掉要插入的值位置,因为要插入的值已经保存到insert_value中。
swap_num+=1
position-=1 #将p值减1是为了继续从右向左比较大小,找到合适的位置。
array_a[position]=insert_value #找到合适的位置后,就将插入的值放在该位置上,完成插入。
print(array_a) #打印每一次的移动情况
print("swap_loop=",swap_num)
'''
结果:
[12, 23, 11, 9, 5, 15, 13, 48, 37, 6] 比较数组0和1,不交换
[11, 12, 23, 9, 5, 15, 13, 48, 37, 6] 2和1,2和0比较,比较后先把1移动到2位置,再把0移动到1的位置,最后把2移动到0的位置。完成插入
[9, 11, 12, 23, 5, 15, 13, 48, 37, 6]
[5, 9, 11, 12, 23, 15, 13, 48, 37, 6]
[5, 9, 11, 12, 15, 23, 13, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 37, 48, 6]
[5, 6, 9, 11, 12, 13, 15, 23, 37, 48]
python算法之插入排序的更多相关文章
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- python算法介绍:希尔排序
python作为一种新的语言,在很多功能自然要比Java要好一些,也容易让人接受,而且不管您是成年人还是少儿都可以学习这个语言,今天就为大家来分享一个python算法教程之希尔排序,现在我们就来看看吧 ...
- python排序之一插入排序
python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...
- 安装Python算法库
安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...
- 【算法】插入排序 insertion_sort
准备写个<STL 源代码剖析>的读书笔记,开个专栏.名为<STL 的实现>,将源代码整理一遍.非常喜欢侯捷先生写在封底的八个字:天下大事.必作于细.他在书中写到:"我 ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python与Go插入排序
#!/usr/bin/env python # -*- coding: utf-8 -*- # 插入排序 # 时间复杂度 O(n^2) import time def logger(func): st ...
- 我的Java开发学习之旅------>Java经典排序算法之插入排序
一.算法原理 插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置. 假设我们输入的是 "53,27,36,15,69, 42" 我们从第二个数字开始,这个数字是27,我们的 ...
随机推荐
- 第五章JavaScript
创建数组://1.字面量方式创建 (推荐大家使用这种方式创建数组 简单粗暴) var colors = ['red','color','yellow'];console.log(colors) //空 ...
- 使用IDEA创建SSM框架
- docker 网络 路由
通过在Docker宿主机上添加静态路由实现跨宿主机通信 模拟环境 主机1(192.168.58.144) 设置docker0 网关 (172.17.0.1/16) 主机2 ...
- python中使用redis实战
from redis import StrictRedis rds = StrictRedis(host='127.0.0.1', port=6379, db=0, decode_responses= ...
- Spring Boot - AMQP 消息中间件
Message Broker是一种消息验证.传输.路由的架构模式,其设计目标主要应用于下面这些场景: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚集.消息的分解,并将结果发送到他 ...
- H3C IRF MAD检测原理及相关问题验证
一.IRF简介 IRF(Intelligent Resilient Framework,智能弹性架构)是H3C自主研发的软件虚拟化技术.它的核心思想是将多台设备通过IRF物理端口连接在一起,进行必要的 ...
- Error configuring application listener of class org.springframework.web.cont
解决方案 1: 1. 打开工程属性对话框,到Deployment Assembly页面,点击Add 2. 选择Jave Build Path Entries 3. 把程序用于的Library加 ...
- Anaconda下安装OpenCV
安装命令:conda install -c https://conda.binstar.org/menpo opencvwin10+Anaconda3+python3.5.2,最终cv版本为3.3.1 ...
- Vue+Typescript项目中使用echarts
方案一:推荐 在typescript+Vue的项目中引用echarts,为了加强引用,引入echarts和@types/echarts两个包,一个是工程依赖,一个是声明依赖. npm install ...
- 使用velodyne16线激光雷达跑loam-velodyne
一.velodyne-VLP16使用教程 推荐网址: http://blog.csdn.net/littlethunder/article/details/51920681 https://www.c ...