阅读目录

  • 一、插入排序的介绍
  • 二、插入排序的原理
  • 三、插入排序的图解
  • 四、插入排序的python代码实现
  • 五、插入排序的C语言代码实现
  • 六、插入排序的时间复杂度
  • 七、插入排序的稳定性

一、插入排序的介绍

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

  那插曲排序是如何借助上面提到的思想来实现排序的呢?首先我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素,然后在未排序区间中依次取出元素并插入到已排序区间的合适位置,并保证已排序区间一直是有序。重复这个步骤直到未排序区间元素为空,算法结束。

  插入排序算法是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素。这种比较是从该有序序列的最末端开始执行,即要插入序列中的元素最先和有序序列中最大的元素比较,若其大于该最大元素,则可直接插入最大元素的后面即可,否则再向前一位比较查找直至找到应该插入的位置为止。插入排序的基本思想是,每次将1个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。插入排序分直接插入排序、折半插入排序希尔排序3类。

二、插入排序的原理

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤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] = tempnumlist = [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=1; i<ArrayLenght; i++){// 从选择插入的数据,一次和它前一个比较,主要比前面的小就交换for (int j=i; j>0; j--){// 判断大小if (array[j]<array[j-1]){// 交换int temp = array[j];array[j] = array[j-1];array[j-1] = temp;}}}
}int main(int argc, const char * argv[]) {// 插入排序函数的声明void insertion_sort(int array[],int ArrayLenght);// 需要排序的数组int a[] = {19,2,13,8,34,25,7};// 调用插入排序insertion_sort(a, 7);// 打印验证for (int i =0; i<7; i++){printf("%d ",a[i]);}return 0;
}

运行结果为:

2 7 8 13 19 25 34

六、插入排序的时间复杂度

  • 最优时间复杂度:O(n) (升序排列,序列已经处于升序状态)
  • 最坏时间复杂度:O(n^2)

七、插入排序的稳定性

  插入排序的基本思想是,每次将1个待排序的数据按其大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。


侯哥语录:我曾经是一个职业教育者,现在是一个自由开发者。我希望我的分享可以和更多人一起进步。分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。当你还没有能力说不得时候,就努力让自己变得强大,拥有说不得权利。"

来源:https://www.cnblogs.com/Se7eN-HOU/p/11069668.html

python算法与数据结构-插入排序算法(34)相关推荐

  1. python算法与数据结构-插入排序算法

    插入排序分析 开始的默认的第一个元素93为有序系列,其余的元素为无序系列,如下所示: 54和93比,54比93小,所以把54放在前面,如下所示: 代码如下所示: # coding:utf-8 def ...

  2. Python–cookbook–1.数据结构与算法

    Python–cookbook–1.数据结构与算法 文章目录 Python–cookbook–1.数据结构与算法 解压序列赋值给多个变量 解压可迭代对象赋值给多个变量 文件对比,对比当前行和之前行 查 ...

  3. python define graph_Python数据结构与算法之图结构(Graph)实例分析

    本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...

  4. python数据结构与算法13_python 数据结构与算法 (13)

    python 数据结构与算法 (13) 选择排序 (Selection sort) 是? 种简单直观的排序算法. 它的? 作原理如 下.? 先在未排序序列中找到最?(?)元素, 存放到排序序列的起始位 ...

  5. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

  6. python数据结构算法_数据结构与算法(Python)

    数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...

  7. Python实战之数据结构和算法

    写在前面 博文为<Python Cookbook>读书笔记整理 读了这本书,才发现Python数据处理远比我想的要强大 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去, ...

  8. 数据结构——插入排序算法详解(C语言)

    插入排序的算法思想是:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适合位置上,直到所有待排序记录全部插入为止. 例如,打扑克牌在抓牌时,每抓一张牌,就插入到合适的位置,直到抓 ...

  9. 循环首次适应算法_数据结构与算法之2——排序问题

    排序真的是数据结构与算法中的重中之重啊,无论是对编程能力的提升,以后工作后的应用,或者是应对面试的时候都是经常需要用到的.基本的几个经典排序一定要做到滚瓜烂熟,能够做到给你一个具体的排序算法题,一定能 ...

最新文章

  1. Docker容器指定使用那几个CPU、memory资源限制
  2. 电大本科c及语言设计形考答案,2020国家开放大学电大《C语言程序设计》网络课形考任务4作业及答案(15页)-原创力文档...
  3. 【PostgreSQL-9.6.3】数据库的启动、登录、退出、关闭
  4. 2015/12/12 考了PAT,又回来玩Python了。
  5. java避免活锁.死锁的解决,java并发编程(九): 避免活跃性危险
  6. 浅谈Delphi过程与函数03 - 零基础入门学习Delphi22
  7. 【语音识别】基于matlab GUI HMM中文语音识别【含Matlab源码 1385期】
  8. amazon sqs java_Amazon SQS消息多传递
  9. 主管叫我看tcpmp播放器,下面几行代码1月没看懂,求求你了,
  10. Linux常见查看日志命令
  11. 项目实训--Unity多人游戏开发(八、3D音效融合AudioMixer、统一的音频播放系统)
  12. 【Kubernetes】Pod学习(五)从Pod到容器:Downward API
  13. 关于position: sticky的简单用法
  14. 计算机毕业设计Java新疆旅游专列订票系统(源码+系统+mysql数据库+Lw文档)
  15. android6自定义锁屏,Android
  16. 程序人生:黑帽seo新手入门基础教程
  17. ibaanalyzer使用教程_ibaanalyzer中文手册
  18. Java多线程2.3.生产者与消费者之间的关系2
  19. 程序员做什么副业最轻松最赚钱?
  20. 泪滴相思染,断肠人在天涯。

热门文章

  1. 经典C语言程序100例之一
  2. python关键字列表的表达式,python 列表推导和生成器表达式的使用
  3. 06_特征选择,特征选择的原因,sklearn特征选择API
  4. 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties
  5. 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
  6. c语言中常见错误总结
  7. 怎么查看计算机一共多少文档,不打开Word文档如何查看文章有几页 -电脑资料
  8. TensorRT(4)-Profiling and 16-bit Inference
  9. 装箱---一个工厂制造的产品形状都是长方体,它们的高度都是 h,长和宽都相等,一共有六个型号,他们的长宽分别为 1*1, 2*2, 3*3, 4*4, 5*5, 6*6.
  10. Butterknife 的简单使用 和 配合 Butterknife的插件 Zelezny