插入排序 Insertion Sort

插入排序的工作方式和对扑克牌的排序非常类似。想象一下打扑克牌时抽牌的过程。一开始我们手中没有牌。当从牌堆中拿到第一张牌时可直接放入手中。当从牌堆中拿到第二张牌时,我们会将它与第一张牌比较,放入合适的位置以维持手中的牌有序,之后依此类推。

和选择排序的区别:

选择排序是首先在无序表中找到最小值,放到有序表的最后一位

插入排序是将无序列表的第一位取出,排序后放入有序列表中

实现:

首先将原列表的第一位当作有序列的第一位,然后从原列表的第二位开始,将第二位和有序列表中的每个元素依次比较,找到合适的位置后,将其后面的元素后移,然后将第二位插入。重复上述步骤直到无序列表没有元素剩余

// java
public static void insertionSort(int[] arr) {for (int i=1; i<arr.length; i++) {int val = arr[i];int pos = i-1;// 排序while(pos >= 0 && val < arr[pos]) {// 将比val大的元素向后移动arr[pos+1] = arr[pos];pos--;}//当退出while循环时,pos就是正确位置的前一位arr[pos+1] = val;}// 打印for (int i=0; i<arr.length; i++) {System.out.println(arr[i]);}
// C++
void insertionSort(vector<int> &nums) {for (int j=1;j<nums.size();j++) {int key = nums[j];int i = j-1;while (i>=0 && nums[i]>key) {nums[i+1] = nums[i];i--;}nums[i+1] = key;}
}

时间复杂度:

平均时间复杂度:T(n)=1+2+⋯+n−2+n−1=n(n−1)2=O(n2)T(n) = 1 + 2 + \dots + n-2 + n-1 = \frac{n(n-1)}{2} = O(n^2)T(n)=1+2+⋯+n−2+n−1=2n(n−1)​=O(n2)

最优时间复杂度:列表正序时,情况最优,但仍需要从第一个元素循环到最后一个元素,因此 T(n)=O(n)T(n) = O(n)T(n)=O(n)

最坏时间复杂度:列表倒序时,情况最坏,不仅需要从第一个元素遍历到最后一个元素,在排序时也需要遍历有序列表的所有元素,因此 T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)

空间复杂度:

由于只用到了常数个临时变量,所以空间复杂度为 O(1)O(1)O(1)

稳定性:

插入排序可以选择不改变等值元素的顺序,因此插入排序是稳定的

总结:
对少量元素或是整体已基本有序的数列,插入排序有着比较优秀的性能。

相关章节
第一节 简述
第二节 稀疏数组 Sparse Array
第三节 队列 Queue
第四节 单链表 Single Linked List
第五节 双向链表 Double Linked List
第六节 单向环形链表 Circular Linked List
第七节 栈 Stack
第八节 递归 Recursion
第九节 时间复杂度 Time Complexity
第十节 排序算法 Sort Algorithm
第十一节 冒泡排序 Bubble Sort
第十二节 选择排序 Select Sort
插入排序 Insertion Sort
第十四节 冒泡排序,选择排序和插入排序的总结
第十五节 希尔排序 Shell’s Sort
第十六节 快速排序 Quick Sort
第十七节 归并排序 Merge Sort

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

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

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

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

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

  3. Caché 算法与数据结构

    第一章 Caché 算法与数据结构 基础和概念 ☆☆☆☆☆ 第二章 Caché 算法与数据结构 数组原理 ☆☆☆☆☆ 第三章 Caché 算法与数据结构 链表原理 ☆☆☆☆☆ 第四章 Caché 算法 ...

  4. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...

    本文将会以插入排序为例,介绍算法与数据结构的基础部分. 插入排序 排序可以说是整个算法中最为基础,最为重要的一部分,而插入排序正是排序算法中最简单的一种解决办法. 什么是排序问题? 输入:n个数的一个 ...

  5. 程序员内功修炼之学好算法和数据结构(一)排序基础、选择排序、插入排序、希尔排序...

    一.排序基础(重要) 1.1 为什么要学习O(n^2)的排序算法? 编码简单,易于实现,是一些简单情景的首选. 在一些特殊情况下,简单的排序算法更有效. 简单的排序算法思想衍生出复杂的排序算法,在这个 ...

  6. 维基百科上的算法和数据结构链接很强大

    突然发现维基百科上的算法和数据结构比百度百科强多啦,图文并茂. 其实这个网站不错:http://www.sorting-algorithms.com 冒泡排序: bubble冒泡的意思 http:// ...

  7. 浅谈算法和数据结构: 五 优先级队列与堆排序

    原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...

  8. python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

    推荐一下「算法与数据结构」从入门到进阶的书单. 一.入门系列 这些书籍通过图片.打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现, ...

  9. jdk7默认gc算法_JDK 7的算法和数据结构

    jdk7默认gc算法 在定期检查JDK中是否存在一种或另一种标准算法时,我决定进行这种索引. 有趣的是,为什么其中包含一些著名的数据结构或算法,而其他却没有? 此调查的格式仅涉及JDK的算法和数据结构 ...

  10. JDK 7的算法和数据结构

    在定期检查JDK中是否存在一种或另一种标准算法时,我决定进行这种索引. 有趣的是,为什么其中包含一些著名的数据结构或算法,而另一些却没有? 此调查的格式仅涉及JDK的算法和数据结构的关键特性和功能,所 ...

最新文章

  1. eclipse关闭mysql数据库,有关于用eclipse连接mysql数据库出现的问题以及解决办法
  2. 自动驾驶软件工程之全局规划
  3. GML-SVG-VML比较
  4. 如何面对你—LNMP高并发时502
  5. SQL Server Indexes
  6. 云服务器怎么查看文件目录结构,查看云服务器目录结构图
  7. php如何测量坐标周围,php – 如何检查经度/纬度点是否在坐标范围内?
  8. SQL Server--实体再复习
  9. 滑块 组件_组件制作:如何使用链接的输入创建滑块
  10. k8s pod之间不能通信_Kubernetes的工作由两个pod组成(必须在不同的节点上运行并相互通信)...
  11. NHK SHV 的 22.2 声道音频系统
  12. 2021牛客暑期多校训练营3,签到题BEFJ
  13. Android sdcard读写权限问题之中的一个
  14. 阶段3 1.Mybatis_11.Mybatis的缓存_7 触发清空一级缓存的情况
  15. 使用bat一键生成bmfont艺术字
  16. R语言---Ubuntu中R语言更新至R4.2.1和R包devtools下载
  17. 安卓手机管理软件_电话录音管理软件有哪些?
  18. 用matlab做仿真实验难不难,SIMULINK仿真实验心得体会
  19. setValue: forKey: 和 setValue: forKeyPath:
  20. 2022年最新二手苹果手机价格表

热门文章

  1. layui如何集成文件服务器,layui使用upload组件实现文件上传功能
  2. Android:Margin和Padding
  3. ssh linux mysql 乱码_JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码
  4. keras 以图搜图
  5. 如何评价三国里的袁绍
  6. 特征工程-统计数据特征
  7. pycharm开发python时出现控制台显示中文乱码
  8. sts引入lombok_Spring Boot中lombok的安装与使用详解
  9. Cracer渗透视频课程学习笔记——漏洞分析
  10. R语言-时间序列-arima模型-forecast、tseries包