动画 | 什么是插入排序?

插入排序

插入排序是比较简单也比较直接的一种排序算法。它是从一堆数据中取出一个数据并将它插入到已排序的数据中合适的位置。

比如按身高排队,有一个人指挥排队从第二个人开始,按身高把当前的人安插到之前排序好队的合适的位置。

或者打扑克牌,假设我们拿到了10,J,K,A这四张牌,然后拿到了Q这张牌,那如何让手中的五张牌变为升序呢?如果我们只学了冒泡排序和快速排序,初始状态是10,J,K,A,Q。

如果是用冒泡排序或者快速排序去做的话,那就可能不合适。结果是对,但是浪费了很多比较次数。

正常人最简单的方式就是,把Q安插到J和K之间就可以了。

插入排序正是如此,它的思想就是维护一个有序区,把元素一个一个插入到有序区中的合适的位置,直到所有元素有序为止。

视频动画

Code

Result

初始状态 [5, 1, 3, 7, 4, 6, 2]
发生交换 [1, 5, 3, 7, 4, 6, 2]
1趟 [1, 5, 3, 7, 4, 6, 2]
发生交换 [1, 3, 5, 7, 4, 6, 2]
2趟 [1, 3, 5, 7, 4, 6, 2]
3趟 [1, 3, 5, 7, 4, 6, 2]
发生交换 [1, 3, 5, 4, 7, 6, 2]
发生交换 [1, 3, 4, 5, 7, 6, 2]
4趟 [1, 3, 4, 5, 7, 6, 2]
发生交换 [1, 3, 4, 5, 6, 7, 2]
5趟 [1, 3, 4, 5, 6, 7, 2]
发生交换 [1, 3, 4, 5, 6, 2, 7]
发生交换 [1, 3, 4, 5, 2, 6, 7]
发生交换 [1, 3, 4, 2, 5, 6, 7]
发生交换 [1, 3, 2, 4, 5, 6, 7]
发生交换 [1, 2, 3, 4, 5, 6, 7]
6趟 [1, 2, 3, 4, 5, 6, 7]

插入排序优化,减少不必要的交换次数

回顾一下上面代码运行的结果,发现有很多次的交换,会有一点一点的时间上的消耗。如果我们做减少交换次数的代码,那如何去写呢?

回顾一下快速排序那篇文章,也使用了减少交换次数的方法。它是一个一个待比较完之后,定位最大的元素或者最小的元素,然后进行交换。

插入排序把待插入的元素做一个标记,和有序区一个一个元素去做比较。假设是从待插入元素的邻近元素开始比较(从后往前),符合条件的前一个元素去复制粘贴到待插入元素的地址。直到不符合条件才插入到合适的位置。

视频动画

Code

Result

初始状态 [5, 1, 3, 7, 4, 6, 2]
发生复制 [5, 5, 3, 7, 4, 6, 2]
1趟 [1, 5, 3, 7, 4, 6, 2]
发生复制 [1, 5, 5, 7, 4, 6, 2]
2趟 [1, 3, 5, 7, 4, 6, 2]
3趟 [1, 3, 5, 7, 4, 6, 2]
发生复制 [1, 3, 5, 7, 7, 6, 2]
发生复制 [1, 3, 5, 5, 7, 6, 2]
4趟 [1, 3, 4, 5, 7, 6, 2]
发生复制 [1, 3, 4, 5, 7, 7, 2]
5趟 [1, 3, 4, 5, 6, 7, 2]
发生复制 [1, 3, 4, 5, 6, 7, 7]
发生复制 [1, 3, 4, 5, 6, 6, 7]
发生复制 [1, 3, 4, 5, 5, 6, 7]
发生复制 [1, 3, 4, 4, 5, 6, 7]
发生复制 [1, 3, 3, 4, 5, 6, 7]
6趟 [1, 2, 3, 4, 5, 6, 7]

原文地址:https://www.cnblogs.com/wotxdx/p/12053873.html

时间: 2024-10-31 08:27:27

动画 | 什么是插入排序?的相关文章

Algs4-2.1.17动画-插入排序

2.1.17动画.修改插入排序和选择排序的代码,使之将数组内容绘制成正文中所示的棒状图.在每一轮排序后重绘图片来产生动画效果,并以一张"有序"的图片作为结束,即所有圆棒均已按照高度有序排列.提示:使用类似于正文中的用例来随机生成Double值,在排序代码的适当位置调用show()方法,并在show()方法中清理画布并绘制棒状图. public class Insertion{    public static void sort(Comparable[] a)    {       

Algs4-2.1.17动画-选择排序

2.1.17动画.修改插入排序和选择排序的代码,使之将数组内容绘制成正文中所示的棒状图.在每一轮排序后重绘图片来产生动画效果,并以一张"有序"的图片作为结束,即所有圆棒均已按照高度有序排列.提示:使用类似于正文中的用例来随机生成Double值,在排序代码的适当位置调用show()方法,并在show()方法中清理画布并绘制棒状图. public class Selection{    public static void sort(Comparable[] a)    {       

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定

ege图形库之动画排序

老师布置了一个学习ege图形库来做动画排序的小动画程序,这是我自己做的效果.由于个人水平有限,可能代码有些地方可以改进.不足之处敬请指出. 注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作.具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html 编程环境:codeblocks   windows10  corei5 cpu 源代码: #include<graphics.h>#include&

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

C++描述基础算法之直接插入排序

由于此博文并不难,所以并不需要搬出C++特性的这些大山,所以就使用简单的C++代码描述了.^_^ 直接插入排序是一种简单的插入排序法,所以适用于少量数据的排序,直接插入排序是比较稳定的一种排序算法. 其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列. 插入排序:时间复杂度O(n^2) 直接插入排序是属于In-place sort(不占用额外内存或占用常数的内存),所以空间复杂度为O(1).上一篇的冒泡排序同样如此

用HTML5实现的各种排序算法的动画比较 及算法小结

用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinaunix.net/uid-20773165-id-1847742.html 1.稳定性比较 插入排序.冒泡排序.二叉树排序.二路归并排序及其他线形排序是稳定的 选择排序.希尔排序.快速排序.堆排序是不稳定的 2.时间复杂性比较 插入排序.冒泡排序.选择排序的时间复杂性为O(n2) 其它非线形排序的时间复杂

iOS百思不得姐、ARKit、旋转动画、立体相册源码等

iOS精选源码 自定义视图弹出实现方案 仿写百思不得姐 ARKit,距离感应,AR尺子 iOS传感器集锦 AR太阳系,动画与光线处理,ARKit iOS启动页广告JYJAdViewController ThemeManager 是一个轻量级的主题管理库,使用简单方便无耦合 旋转跑马屏风动画Donut ARKit,AR尺子 3D立体可旋转相册 -- 原创应用:大杨子相册 iOS优质博客 iOS代码加固/混淆 众所周知的是大部分iOS代码一般不会做加密加固,因为iOS APP一般是通过AppStor

秒懂插入排序与选择排序

插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序核心:假设第一个元素排好,之后的元素对排好的部分从后向前比较并逐一移动. 插入排序实现: void insertion_sort(int a[], int n) { int i,j,tmp; for (i = 1; i < n; i++) { tmp = a[i]; for (j = i - 1; j >= 0 && a[j] > tmp; j--) {