python算法与数据结构-插入排序算法(34)
一、插入排序的介绍
插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示:

那插曲排序是如何借助上面提到的思想来实现排序的呢?首先我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素,然后在未排序区间中依次取出元素并插入到已排序区间的合适位置,并保证已排序区间一直是有序。重复这个步骤直到未排序区间元素为空,算法结束。
插入排序算法是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素。这种比较是从该有序序列的最末端开始执行,即要插入序列中的元素最先和有序序列中最大的元素比较,若其大于该最大元素,则可直接插入最大元素的后面即可,否则再向前一位比较查找直至找到应该插入的位置为止。插入排序的基本思想是,每次将1个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。插入排序分直接插入排序、折半插入排序和希尔排序3类。
二、插入排序的原理
- 从第一个元素开始,该元素可以认为已经被排序
 - 取出下一个元素,在已经排序的元素序列中从后向前扫描
 - 如果该元素(已排序)大于新元素,将该元素移到下一位置
 - 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
 - 将新元素插入到该位置后
 - 重复步骤2~5
 
三、插入排序的图解






四、插入排序的python代码实现
# 定义插入排序函数
def insertion_sort(list):
# 获取需要排序数据的个数
N = len(list)
# 插入排序的第一次插入从第二个数字开始选择,所以下标从1开始
for i in range(1,N):
# 从选择插入的数据,一次和它前一个比较,主要比前面的小就交换
for j in range(i,0,-1):
# 判断大小
if list[j]<list[j-1]:
# 交换
temp = list[j]
list[j] = list[j-1]
list[j-1] = temp numlist = [19,2,13,8,34,25,7]
print("排序前:%s"%numlist)
insertion_sort(numlist)
print("排序后:%s"%numlist)
运行结果为:
排序前:[19, 2, 13, 8, 34, 25, 7]
排序后:[2, 7, 8, 13, 19, 25, 34]
五、插入排序的C语言代码实现
#include <stdio.h>
// 定义插入排序函数
void insertion_sort(int array[],int ArrayLenght)
{
// 插入排序的第一次插入从第二个数字开始选择,所以下标从1开始
for (int i=; i<ArrayLenght; i++)
{
// 从选择插入的数据,一次和它前一个比较,主要比前面的小就交换
for (int j=i; j>; j--)
{
// 判断大小
if (array[j]<array[j-])
{
// 交换
int temp = array[j];
array[j] = array[j-];
array[j-] = temp;
}
}
}
} int main(int argc, const char * argv[]) {
// 插入排序函数的声明
void insertion_sort(int array[],int ArrayLenght);
// 需要排序的数组
int a[] = {,,,,,,};
// 调用插入排序
insertion_sort(a, );
// 打印验证
for (int i =; i<; i++)
{
printf("%d ",a[i]);
}
return ;
}
运行结果为:
六、插入排序的时间复杂度
- 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
 - 最坏时间复杂度:O(n^2)
 
七、插入排序的稳定性
插入排序的基本思想是,每次将1个待排序的数据按其大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。
python算法与数据结构-插入排序算法(34)的更多相关文章
- 用Python实现的数据结构与算法:开篇
		
一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...
 - Python实现的数据结构与算法之队列详解
		
本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操 ...
 - 用python语言讲解数据结构与算法
		
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...
 - [0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程
		
忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处. ——奥维德 一.学习目标 · 回顾在计算机科学.编程和问题解决过程中的基本知识: · 理解“抽象”在问题解决过程中的重要作用: · 理解并实现抽象 ...
 - python 下的数据结构与算法---8:哈希一下【dict与set的实现】
		
少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:H ...
 - python 下的数据结构与算法---1:让一切从无关开始
		
这段时间把<Data Structure and Algorithms with python>以及<Problem Solving with Algorithms and Dat ...
 - python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表
		
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...
 - 用Python实现的数据结构与算法:基本搜索
		
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
 - Python实现的数据结构与算法之基本搜索详解
		
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分 ...
 
随机推荐
- windows中怎么添加定时任务
			
linux中有crontab定时任务,很方便 其实windows也有类似的 需求:定时执行python脚本 1.Windows键+R,调出此窗口,输入compmgmt.msc 2. 每分钟都执行一次脚 ...
 - Tomcat免安装版执行tomcat9.exe闪退
			
Tomcat免安装版点击startup.bat可成功启动,但是执行tomcat9.exe时却闪退,这是因为免安装版的tomcat不会自动把tomcat注册到windows服务里,需要手动注册. 解决办 ...
 - Harbor的安装和基本使用
			
Harbor是一个开源的云原生registry工程.Harbor对开源的Docker Distribution扩进行了扩展,支持registries之间镜像的复制功能,而且还提供了一些高级的安全方面的 ...
 - 【视频开发】关于FFMPEG中内存泄漏的问题之av_bitstream_filter_filter
			
How may I free pkt in an ffmpeg write frame method Rate this: See more: C++ ffmpeg Greetings I' ...
 - Python代码编码规范
			
目录 1. Introduction 介绍 2. A Foolish Consistency is the Hobgoblin of Little Minds 尽信书,则不如无书 3. Code la ...
 - [转帖]Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞
			
Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞 https://news.cnblogs.com/n/647075/ 强烈建议:Chrome 用户请尽快升级浏览器!在谷歌今天发布的紧急补丁程序 ...
 - C++ 读取一个文件下所有文件的文件名
			
Windows: #include<iostream> #include<string> #include <io.h> void readFileNameInDi ...
 - 2019/7/18ACM集训
			
2019-07-18 09:15:34 这个是练习刷的题 Vus the Cossack and Numbers Vus the Cossack has nn real numbers aiai. I ...
 - JavaScript中的原型prototype和__proto__的区别及原型链概念
			
问题 初学js的同学,总是搞不清楚js中的原型是什么东西,看着控制台打印出来的一串串__proto__,迷惑不已. 例如我定义一个Person,创建一个实例p,并打印实例. function Pers ...
 - 创建job,delete定时清理数据
			
Job定时删除数据 需求:对一个表,每天删除一月前的历史数据 思路 .编写SQL,删除一月前的历史数据,使用函数取值 .测试JOB创建,查询,维护,管理 .测试布置job,满足效果 ***测试数据准备 ...