声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,java代码等

0、其他排序算法索引(待更)

java数据结构与算法——快速排序
java数据结构与算法——桶排序

1、插入排序的思想及原理

插入排序一般分为直接插入排序二分插入排序,本文只介绍直接插入排序,两者的区别仅在于插入的方式不一样。

插入排序是在待排序数组里插入数据。一般我们认为插入排序就是往一个已经排好序的数列中插入一个元素,使得插入这个数以后,数组仍然有序。

下面具体介绍下插入排序的思路:

  • 首先需要明确待排序的数组由两部分组成,一部分是已经排好序的部分,另一部分是待排序的部分。
  • 接着我们每次选取待排序部分的第一个元素,分别与前面排好序的元素进行比较。当大于前面元素时,可以将该元素直接进入已排好序的部分; 当小于前面元素时,需要把这个元素拿出来暂存,将前面的元素后移,继续与前面的元素相比,直到比较到数组第一个元素或者出现第一个小于拿出的这个元素,这时停止比较、移动,直接把这个元素放到当前空位上。
  • 一直重复步骤2,直到待排元素已经没有元素可进行插入时,停止操作,当前数列为已排好序的数列。

2、插入排序java代码实现

首先最外层必定有个大循环,用于待排序部分的数列。还需要一个内层循环,分别与前面排好序的部分进行比较和移动,直到找到位置可以进行插入。参照扑克牌摸牌后排序

public class InsertSort {private int[] array;public InsertSort(int[] array){this.array = array;}public void insertSort(){if(array==null){throw new RuntimeException("没有待排数组");}int length = array.length;if(length>0){for(int i=1;i<length;i++){int temp = array[i]; //记录未排好序的第一个元素为tempint j = i;   for(;j>0&&array[j-1]>temp;j--){  //原理中的步骤2array[j] = array[j-1];   //移位}array[j] = temp;   //插入}}}public void print(){  //用于打印排完序后的数组for(int i=0;i<array.length;i++){System.out.println(array[i]);}}
}

测试程序

public class SortTest {public static void main(String[] args) {insertSortTest();}private static void insertSortTest(){int[] array = {3,5,0,7,1,4,6};InsertSort is = new InsertSort(array);is.insertSort();is.print();}
}

3、插入排序的特点及性能

插入排序和玩扑克牌摸牌后在手中排序一样的原理,比较容易理解。插入排序在序列近似有序时,效率比较高,因为此时减少了比较和移动的次数。

从原理和代码来看,插入排序的时间复杂度尾O(n^2),外层循环执行n次,内层在最坏的情况下也执行n次,并且除了比较操作还有移动操作。最好的情况是序列近似有序,这时内层循环只需比较及移动较少个元素即可完成。当序列本身有序时,插入排序的时间复杂度为O(n)。因此,在数列越有序,效率越高。

空间复杂度为O(1),是常量级的。因为只用了一个变量暂存每次未排好序的首个元素。

插入排序是稳定的排序算法,因为是在相对排好序的基础上进行比较和移动,所以可以保持相对顺序不变,所以是稳定的排序算法。

4、插入排序的适用场景

插入排序的特点是在近似有序的情况下效率比较高。但因为其时间复杂度为O(n^2),所以通常并不单独适用。在所有的排序算法中,我们优先使用快速排序。快速排序在分区规模达到一定的值时(比如10左右),我们改用插入排序算法排该分区。因为此时的分区内数据往往是近似有序的,所以使用快排并不一定优于插入排序。在很多高级语言在内部对快速排序的实现中,也是在分区达到一定规模改用插入排序来排该分区。

其他排序算法索引(待更)
java数据结构与算法——快速排序
java数据结构与算法——桶排序

码字不易,如对您有帮助,欢迎点赞收藏打赏^_^

Java数据结构与算法——插入排序相关推荐

  1. 【笔记】Java数据结构与算法

    [笔记]Java数据结构与算法 文章目录 [笔记]Java数据结构与算法 1.八大排序应用场景 2.未完待续-- 1.八大排序应用场景 冒泡排序:优化后的冒泡排序可用于当数据已经基本有序,且数据量较小 ...

  2. Java数据结构与算法(二)

    Java数据结构与算法(二) 第六章 递归 1 递归应用场景 2 递归的概念 3 递归调用机制 4 递归能解决什么样的问题 5 递归需要遵守的重要规则 6 递归-迷宫问题 6.1 迷宫问题 6.2 代 ...

  3. Java数据结构和算法(第二版)

    Java数据结构和算法(第二版) 下载地址 https://pan.baidu.com/s/112D5houIgu0eMs_i5o0Ujw 扫码下面二维码关注公众号回复 100066获取分享码 本书目 ...

  4. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,--中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

  5. 数据结构 - Java -韩顺平 图解Java数据结构和算法

    数据结构 Lesson 1 数据结构的知识总结 1. 几个经典的算法面试题 2. 线性结构与非线性结构 2.1 稀疏数组 sparsearray 2.2 队列 2.2.1 顺序队列: 2.2.2 环形 ...

  6. 一.Java数据结构与算法:如何开始

    数据结构和算法是计算机科学的核心概念之一,它们在软件开发中起着至关重要的作用.学习Java数据结构和算法不仅有助于提高编程能力,还能让你在面试和职业发展中脱颖而出.本文将为你介绍数据结构和算法的重要性 ...

  7. 【Java面试高频问题】Java数据结构和算法基础知识汇总

    文章目录 Java数据结构和算法基础知识 一.Java数据结构 1. 线性结构:数组.队列.链表和栈 1.1 数组(Array) 1.2 稀疏数组 1.3 队列(Queue) 1.4 链表(Linke ...

  8. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  9. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

最新文章

  1. python新手任务:python循环嵌套
  2. Java基础之多线程框架
  3. BZOJ4723[POI2017]Flappy Bird——模拟
  4. VTK:绘制BlankPoint空白点用法实战
  5. cgic: 为C语言编写CGI的C函数库
  6. nodejs --inspect-brk结合Chrome开发者工具的调试
  7. 二次扩增产物条带弥散_PCR实验操作常见解决方法
  8. android studio gradle home,Android Studio3.0 Gradle 4.1配置
  9. java定时执行bat_如何自动执行多个批处理命令
  10. 前端es6文档大全,你想要的这都有
  11. Android性能测试工具Emmagee介绍
  12. 小游戏1024纯C语言
  13. swarm测试网如何查票?查票流程
  14. 技术真好玩第一期(2019-11-01)
  15. Java兔子生兔子问题
  16. 在职计算机培训班,计算机科学与技术在职研究生招生院校有哪些?
  17. Python中__str__的用法
  18. 物理系统之碰撞检测——碰撞器
  19. Java通过javacsv实现读取csv文件数据
  20. OpenCore-Legacy-Patcher 0.5.1正式版

热门文章

  1. python代码需要背吗-python程序需要编译吗
  2. python写一个游戏多少代码-Python项目实战之猜数字游戏(含实现代码)
  3. 自学python哪本书比较好-自学Python一年,看了几十本书,我发现了这些捷径!
  4. LeetCode Maximum XOR of Two Numbers in an Array(贪心、字典树)
  5. UVa11300 Spreading the Wealth(数学问题)
  6. 网络编程中的注意问题
  7. golang json 读写配置文件
  8. Xamarin.Android 使用Timer 并更改UI
  9. 阿里巴巴Java开发手册———个人追加的见解和补充(一)
  10. JavaScript 之 特殊运算符