最近在和小伙伴们一起研究排序,排序分好多总,后期会做整体总结,本篇则主要对插入排序进行一个整理。
插入排序(insert sorting)的算法思想十分简单,就是对待排序的记录逐个进行处理,每个新纪录与同组那些已排好序的记录进行比较,然后插入到适当的位置。用三个字总结就是—-“多对一”的关系。
插入排序分好几种,比如二分插入排序,交换插入排序,直接插入排序,本篇我们重点总结最熟悉的“直接插入排序”。
比如有一个数组【45 34 78 12 34’ 32 29 64】,我们针对此进行一下讲解。

排序过程 数组{45 34 78 12 34’ 32 29 64}
第一遍 45和34比较,34<45,所以排序完成为34 45 78 12 34’ 32 29 64
第二遍 78和34 45比较 78>45 78>34,所以位置不变,排序完为 34 45 78 12 34’ 32 29 64
第三遍 12和34 45 78比较 12<78 左移+1,12<45 左移+2,12<34 左移+3,排序完为 12 34 45 78 34’ 32 29 64
第四遍 34’ 左移+2 排序完 12 34 34’ 45 78 32 29 64
第五遍 32 左移+4 排序完 12 32 34 34’ 45 78 29 64
第六遍 29 左移+6 排序完 12 29 32 34 34’ 45 78 64
第七遍 64 左移+1 排序完 12 29 32 34 34’ 45 64 78

用代码实现的话其实更简单,引入一个临时变量,具体看代码:

 public static void main(String[] args) {Test2 test2 = new Test2();//定义一个数组int[] array = {45, 34, 78, 12, 34, 32 ,29 ,64};test2.insertSort(array);System.out.println(Arrays.toString(array));}void insertSort(int[] array) {//定义的临时变量int tempRecord;//i从1开始的原因是j=j-1for (int i = 1; i < array.length; i++) {tempRecord = array[i];int j = i - 1;//j不能为负数,根据索引判定值大小,通过临时变量进行交换while (j >= 0 && tempRecord < array[j]) {array[j + 1] = array[j];j = j - 1;}array[j + 1] = tempRecord;}}
2018年07月30日14:30:55补充:
array[j + 1] = tempRecord,应该放入while循环内,因为若tempRecore不小于array[j],则此次i循环则直接结束。

通过代码我们来看一下时间复杂度和空间复杂度。
因为我们只引入了一个辅助存放插入记录的临时变量,因此空间代价为一个记录大小 及O(1);

当数据正序时,如上我们口述的排序比较过程,执行效率最好,每次插入都不用移动前面的元素,有N个元素参与比较,时间复杂度为O(N)。

当数据反序时,则执行效率最差,每次插入都要前面的元素后移,
i=1时,移动2-1;
i=2时,移动3-1;
当i=n时,移动n-1;
求和公式:n(n-1)/2=O(n2)
所以最坏的时间复杂度为O(N2)

转载于:https://www.cnblogs.com/huohuoL/p/10545426.html

排序系列【比较排序系列之】直接插入排序相关推荐

  1. shell sort 最后一列排序_十个必知的排序算法|Python实例系列[1]

    实例内容: 十个必知的排序算法具体代码,并简略的得知每种算法对于不同长度数列的排序时间 十大排序: 1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶 ...

  2. list 排序_十个必知的排序算法|Python实例系列

    十大排序: 1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶排序10.基数排序 完整代码和注释如下 # -*- coding: UTF-8 -*-# ...

  3. shell sort 最后一列排序_算法实现系列(1)—— 排序算法

    1.冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地遍历过要排序的数列,每次比较两个元素,如果它们的顺序不符合预期,就把它们的位置交换过来.遍历数列的工作是重复地进行直到没有 ...

  4. 9个元素换6次达到排序序列_原创系列 |冒泡排序提升为快速排序,都发生了什么?...

    「Python与算法社区」 第 310 篇原创 " 1 你会学到什么? " 彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的 ...

  5. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  6. 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较

    掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...

  7. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  8. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  9. C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

    参考:C语言五大排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)动态演示 作者:一只青木呀 发布时间: 2020-09-09 20:18:43 网址:https://blog.csdn.net/ ...

  10. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)

    一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...

最新文章

  1. 构建增强现实移动应用程序的六款顶级工具
  2. 使用webpack配置react并添加到flask应用
  3. java 连等_java并发之LBQ和ABQ(1)
  4. hibernate中antlr对于hql与sql的转换源码的一些细节
  5. PostgreSQL 12系统表(9)pg_settings
  6. 华为S2600T------v1版本
  7. 家里的狗为什么打不过猫
  8. 基于C语言的双人贪吃蛇游戏程序设计
  9. 在电脑上如何快速制作一寸照片?在线一键制作工具推荐给你
  10. win10系统无法开启远程服务器配置,win10系统无法连接远程服务器的方案介绍...
  11. 结合OPENCV SIFT代码浅谈Lowe的一些SIFT算法细节
  12. Auto.js蚂蚁森林自动偷能量脚本
  13. 大数据背后的神秘公式(上):贝叶斯公式
  14. 产品经理 项目经理 技术经理的区别
  15. uni-app 封装接口 405错误
  16. 数据同步利器之Tapdata Cloud
  17. Fiddler 安装使用教程
  18. Delphi下的MPS
  19. 通信原理简明教程 | 信号、信道与噪声
  20. Linux文件系统功能和作用详解

热门文章

  1. 【Loj - 515】贪心只能过样例(暴力,或01背包 + bitset)
  2. 【CodeForces - 485D】Maximum Value (枚举,用数组离散化,数学,取模运算,因子,筛法)
  3. 传统POS/终端/银联POS简介
  4. Apollo进阶课程⑯丨Apollo感知之旅——感知概貌
  5. mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)
  6. app+java_‎App Store 上的“Java大全”
  7. Oracle数据库Date类型查询问题(
  8. 学习笔记7-C语言-进制转换、原返补、位运算、函数
  9. 剑指offer之求1+2+...+n
  10. Linux下的xml文件的创建