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

前言: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. 谷歌-百度世界杯大数据预测,哪家更准?
  2. 树形菜单 php,简单的树形菜单_php
  3. 系统进入低功耗的配置
  4. Jasypt 加密-整合SpringBoot
  5. (21)xilinx PCIE 开发方法(学无止境)
  6. windows下配置nginx+php环境
  7. 技术领导者携力为数据中心和其它市场带来开放的加速架构
  8. Haskell 开发平台安装及Hello World
  9. 树莓派 口罩识别 python_RaspberryPi上实现佩戴口罩识别——2020电赛F题小记
  10. 4.28下午 听力611
  11. Atiitt 软件设计之道 attilax著 1. 总概念 隶属于软件工程。。 2 2. 需求分析 3 3. 设计分类 3 3.1. 按照力度 总体设计架构设计 概要设计 详细设计 3 3.2.
  12. windows服务器防勒索病毒
  13. 华为2019校招实习笔试-软件题
  14. STOP:0x0000007E蓝屏软件故障处理
  15. 2022年全球光纤机械接头市场前景分析及研究报告
  16. Koalas - 入门基本操作
  17. 24.树莓派交叉编译工具链的安装
  18. 【高通SDM660平台 Android 10.0】(14) --- Camera ISP
  19. 设计师需要什么证书及学历
  20. 2019HDU多校第一场 HDU6578 Blank

热门文章

  1. python3.8.5 run-Python 3.8.5 正式发布
  2. python处理excel教程实例-python 读写excel文件操作示例【附源码下载】
  3. python用于什么-python主要应用在哪些领域?
  4. python2 中使用pip2 install package_name的时候报错:AttributeError: ‘int‘ object has no attribute ‘endswith‘
  5. NVIDIA Jetson Xavier NX使用SD镜像刷机流程
  6. 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
  7. LeetCode 452 Minimum Number of Arrows to Burst Balloons(贪心法)
  8. Python中的collections
  9. reGeorg+Proxifier使用
  10. jdk1.7 hashmap多线程下的死循环