目录

  • 插入排序概念
  • 代码实现
  • 时间复杂度
  • 代码改进

插入排序概念

插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间

动图展示

代码实现

import java.util.Arrays;public class InsertSort {public static void main(String[] args) {int[] arr = {4, 5, 6, 3, 2, 1};insertSort(arr);
//        [4, 5, 6, 3, 2, 1]
//        [4, 5, 6, 3, 2, 1]
//        [3, 4, 5, 6, 2, 1]
//        [2, 3, 4, 5, 6, 1]
//        [1, 2, 3, 4, 5, 6]}//插入排序public static void insertSort(int[] arr) {//遍历所有的数字,从第二个开始和前一个比较for (int i = 1; i < arr.length; i++) {//如果当前数字比前一个数字小if (arr[i] < arr[i - 1]) {//把当前遍历的数字存起来int temp = arr[i];//遍历当前数字前面的数字int j;for (j = i - 1; j >= 0 && temp < arr[j]; j--) {//把前一个数赋给后一个数arr[j + 1] = arr[j];}//把临时变量(外层for循环的当前元素)赋给不满足条件的后一个元素arr[j + 1] = temp;}//打印每次排序后的结果System.out.println(Arrays.toString(arr));}}
}

时间复杂度

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

在第一趟排序中,插入排序最多比较一次,第二趟最多比较两次,依次类推,最后一趟最多比较N-1次。因此有:1+2+3+...+N-1 = N*N(N-1)/2

因为在每趟排序发现插入点之前,平均来说,只有全体数据项的一半进行比较,我们除以2得到:N*N(N-1)/4

复制的次数大致等于比较的次数,然而,一次复制与一次比较的时间消耗不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。

与冒泡排序、选择排序一样,插入排序的时间复杂度仍然为O(N^2),这三者被称为简单排序或者基本排序,三者都是稳定的排序算法。

如果待排序数组基本有序时,插入排序的效率会更高

代码改进

在插入某个元素之前需要先确定该元素在有序数组中的位置,上例的做法是对有序数组中的元素逐个扫描,当数据量比较大的时候,这是一个很耗时间的过程,可以采用二分查找法改进,这种排序也被称为二分插入排序

import java.util.Arrays;public class InsertSort {public static void main(String[] args) {int[] arr = {4, 5, 6, 3, 2, 1};insertSort(arr);
//        [4, 5, 6, 3, 2, 1]
//        [4, 5, 6, 3, 2, 1]
//        [3, 4, 5, 6, 2, 1]
//        [2, 3, 4, 5, 6, 1]
//        [1, 2, 3, 4, 5, 6]}//二分插入排序public static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i++) {//如果新记录小于有序序列的最大元素,则用二分法找出新纪录在有序序列中的位置if (arr[i] < arr[i - 1]) {int temp = arr[i]; //定义temp存储所要插入的数int left = 0; //最左边的数,从str[0]开始int right = i - 1; //最右边位,所要插入那个数的前一位while (left <= right) {int middle = (left + right) / 2;   //mid中间位//如果值比中间值大,让left右移到中间下标+1if (arr[middle] < temp) {left = middle + 1;}//如果值比中间值小,让right左移到中间下标-1else {right = middle - 1;}}//以左下标为标准,在左位置前插入该数据,左及左后边全部后移for (int j = i; j > left; j--) {arr[j] = arr[j - 1];}arr[left] = temp;}System.out.println(Arrays.toString(arr));}}
}

数据结构与算法之插入排序(含改进版)相关推荐

  1. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

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

    数据结构与算法之插入排序 目录 插入排序介绍 插入排序思路分析 代码实现 1. 插入排序介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的. 2. 插 ...

  3. 数据结构与算法 | 直接插入排序、希尔排序

    前几章讲了选择排序中的直直接选择排序.双向选择排序.堆排序,这次来讲讲利用'插入'为核心来实现的插入排序算法. 插入排序 把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所 ...

  4. 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)

    *排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...

  5. (数据结构与算法)插入排序和希尔排序

    1. 插入排序 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序 ...

  6. 数据结构与算法17-表插入排序

    2019独角兽企业重金招聘Python工程师标准>>> 表插入排序 随机产生一组数,通过链表进行排序,然后在复制到数组中,提高效率 class Link {public long d ...

  7. 数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)

    数据结构和算法的重要性 算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算 数据结构和算法的关系: 程序 = 数据结构 + 算法 数据结构是算法的基础, 换言之,想要学好算法,需要把数 ...

  8. Python天天美味(32) - python数据结构与算法之堆排序

    1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data):     for i in ran ...

  9. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

最新文章

  1. G.703通道故障打环测试方法
  2. 4.3、Libgdx启动类和配置
  3. vertrigoserv mysql 密码_VertrigoServ
  4. vue elementUI表单输入时触发事件@input
  5. Win32汇编学习[7]: 定义符号常量(=、EQU、TEXTEQU)
  6. 【转载】送到榨油厂的飞鸽传书
  7. javascript面试题(一)
  8. UCI下载葡萄酒数据
  9. mysql程序设计考试app_MySQL数据库设计与应用知到APP期末考试完整答案
  10. 怎样在线将图片转换成icon图标
  11. 开着代理的情况下,Win10 UWP 应用无法联网
  12. 雅思阅读--读书笔记
  13. file upload 攻防世界_菜鸡 CTF 之旅 Writeup (攻防世界)
  14. 如何查找IBM P5、6的HMC管理地址
  15. 使用Python解析MNIST数据集(IDX格式文件)
  16. Qt获取CPU编号和硬盘序列号
  17. APIO2015巴厘岛的雕塑——数位DP
  18. 哪家互联网大厂,对离职员工最“狠”?
  19. Win10家庭版Hyper-V出坑(完美卸载,冲突解决以及Device Guard问题)
  20. iOS 11降系统到iOS 10,苹果刷机图文教程

热门文章

  1. webview和H5 清除缓存和缓存文件删除。
  2. IDEA 如何自动定位文件位置
  3. 初学Python--微信自动回复信息以及防撤回
  4. php健身房管理系统文献综述,课程教材管理系统设计-php(开题报告+源程序+论文+答辩PPT+文献综述)...
  5. OpenGL 2D贴图texture与着色器Shader
  6. 应对数据安全典型薄弱点,这家医院“外防内控”筑牢屏障
  7. win10百度网盘不限速(百度网盘直接下载助手 +油猴脚本)(2019.3.15更新)
  8. 《公司的力量》第一集 公司!公司!
  9. Edge-SLAM论文翻译
  10. 注册测绘师学习笔记(五)