插入排序

插入式排序属于内部排序法对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

排序思想

把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的.适当位置,使之成为新的有序表

图解

举个例子,上面的图数据太长,我们来个简单的例子,加入有个数组是[17,3,25,14,20,9]

插入排序怎么排序呢?

首先第一个元素17看成是有序表,那么剩下的就是无序表

第一次插入:插入3,跟有序表比较,比17小,按照我们的从小到大规则,插入到17前面

成为 [(3,17) 25,14,20,9]

第二次插入:插入25,跟有序表[3,17]比较,比我们17大,放在17后面

成为 [(3,17,25) 14,20,9]

第三次插入:插入14,跟有序表(3,17,25)比较,比25小,往前找,比17小再往前,比3大,介于3,17之间。插入成为 [(3,14,17,25) 20,9]

依次类推,直至无序表没有数据

共要进行n-1次插入

请听题:

科大有一宿舍学生,成绩分别是:101,34,119,1

请用插入排序,将他们的成绩从小到大排列

代码实现

package com.wang.sort;import java.util.Arrays;/*** @author 王庆华* @version 1.0* @date 2020/12/24 16:05* @Description TODO* @pojectname 插入排序算法*/
public class InsertSort {public static void main(String[] args) {int[] arr = {101,34,119,1};insertSort(arr);}//插入排序//逐步推到//第一次插入101,34,119,1====>34,101,119,1public static void insertSort(int[] arr){//定义待插入的数   34是下标为0的元素int insertValue = arr[1];int insertIndex = 1-1;//跟谁比较,跟前面的数比较//给insertValue找到插入位置while (insertIndex >=0 && insertValue <arr[insertIndex]){//insertIndex >=0保证我们找位置的时候不越界//insertValue <arr[insertIndex]==》说明我们还没找到位置//没有找到位置,说明我们的insertIndex代表的值大,往后面走arr[insertIndex+1] = arr[insertIndex];//数组变成了 101,101,119,1//我们的34被保存到了insertValue中insertIndex--;}//当退出while循环时,位置找到arr[insertIndex+1] = insertValue;System.out.println("第一次插入后的数组:"+ Arrays.toString(arr));//第二轮insertValue = arr[2];insertIndex = 2-1;while (insertIndex >=0 && insertValue <arr[insertIndex]){//insertIndex >=0保证我们找位置的时候不越界//insertValue <arr[insertIndex]==》说明我们还没找到位置//没有找到位置,说明我们的insertIndex代表的值大,往后面走arr[insertIndex+1] = arr[insertIndex];//数组变成了 34,101,119,1//我们的34被保存到了insertValue中insertIndex--;}//当退出while循环时,位置找到arr[insertIndex+1] = insertValue;System.out.println("第二次插入后的数组:"+ Arrays.toString(arr));//第三轮insertValue = arr[3];insertIndex = 3-1;while (insertIndex >=0 && insertValue <arr[insertIndex]){//insertIndex >=0保证我们找位置的时候不越界//insertValue <arr[insertIndex]==》说明我们还没找到位置//没有找到位置,说明我们的insertIndex代表的值大,往后面走arr[insertIndex+1] = arr[insertIndex];//我们的34被保存到了insertValue中insertIndex--;}//当退出while循环时,位置找到arr[insertIndex+1] = insertValue;System.out.println("第三次插入后的数组:"+ Arrays.toString(arr));}}

为什么退出的时候,我们的insertIndex要+1呢?因为我们一开始定义这个insertIndex的时候减去了一个1,跟我们的图解差不多

图解中,每插入一个元素的时候,我们发现有一个绿色的标记,那个就是我们的insertIndex所处的位置,好比243,排序3,我先跟谁比较?这个时候3的下标是2,他要先跟4比较也就是下标为1的元素,那我们insertIndex就是2-1正好是4,比较发现小,那么我们进入while循环,数组变成244,insertIndex变成了0,再去判断循环,这个时候的insertValue >arr[insertIndex],现在的insertIndex就是绿色柱子2,我们3比绿色数字要大,当时比刚才那个有小,所以我们插入的位置就在insertIndex+1的位置

插入排序算法

/*** @author 王庆华* @version 1.0* @date 2020/12/24 16:05* @Description TODO* @pojectname 插入排序算法*/
public class InsertSort {public static void main(String[] args) {int[] arr = {101,34,119,1};insertSort(arr);System.out.println(Arrays.toString(arr));}public static void insertSort(int[] arr){for (int i = 1; i <arr.length; i++) {//从1个元素开始,不需要减一,减一的话我们的最后一个元素就不插入了int insertValue = arr[i];int insertIndex = i-1;//跟谁比较,跟前面的数比较//给insertValue找到插入位置while (insertIndex >=0 && insertValue <arr[insertIndex]){//insertIndex >=0保证我们找位置的时候不越界//insertValue <arr[insertIndex]==》说明我们还没找到位置//没有找到位置,说明我们的insertIndex代表的值大,往后面走arr[insertIndex+1] = arr[insertIndex];//数组变成了 101,101,119,1//我们的34被保存到了insertValue中insertIndex--;}arr[insertIndex+1] = insertValue;}}
}

外层for循环控制我从从那个位置开始准备插入,起始位置是arr[1],因为arr[0]我们当成了有序列表

那么外层循环就是arr[1],找位置arr[2]找位置……

内层while循环是用来找位置的,判断是不是我们要插入的位置,也就是我们推导过程说的那样
当然有人会问,我们的arr[insertIndex+1] = insertValue;地方如果恰好是相等的,不用交换呢?你可以加一个if去判断,但是这个优化,效果不大

问题

我们看简单的插入排序可能存在的问题.
数组arr = {2,3,4,5,6,1}这时需要插入的数1(最小),这样的过程是:
{2,3,4,5,6, 6}
{2,3,4,5,5, 6}
{2,3,4,4,5, 6}
{2,3,3,4,5, 6}
{2,2,3,4,5, 6}
{1,2,3,4,5, 6}
结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.

那么如何优化插入排序呢?=====>希尔排序

这就是插入排序(直接插入排序),有什么地方说错了,说的不好,大家可以交流下

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

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

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

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

    一.图解排序过程 二.代码实现 三.完整代码 <!DOCTYPE html> <html lang="en"> <head><meta c ...

  3. Python 数据结构与算法 —— 插入排序

    本文你将学会如下的要点: 使用 Python 语言进行算法设计时,和 C 语言实现相比,需要注意哪些问题 如何尽可能少地利用辅助空间,因为在 Python 编程环境中,定义一个 list实在是唾手可得 ...

  4. Python 数据结构与算法——插入排序(insertion sort)

    我们先归纳性地假设前 n−1n-1 个元素已经完成排序,现在要将第 n<script id="MathJax-Element-2" type="math/tex&q ...

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

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

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

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

  7. 数据结构与算法:十大排序算法之插入排序

    数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...

  8. 数据结构与算法:冒泡排序、插入排序、选择排序

    排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序.睡眠排序.面条排序等.本文只众多排序算法中的一小撮,也是最经典的.最常用的:冒泡排序.插入排序.选择排序.归并排序.快速排序.计数排序.基数 ...

  9. python数据结构与算法总结

    python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...

  10. 数据结构与算法:22 精选练习50

    精选练习50 马上就要期末考试或者考研了.为了大家复习的方便,我精选了有关数据结构与算法的50道选择题,大家可以抽空练习一下.公众号后台回复"答案"可以获取该50道题目的答案. 0 ...

最新文章

  1. C#是否该支持“try/catch/else”语法
  2. k8s kafka集群 连接不上_图解 K8s 核心概念和术语
  3. JS 版的pnp in_array($str,$arr)
  4. DotNet Framework 版本历史
  5. Spring boot拦截器登录检查
  6. 【Github教程】史上最全github用法:github入门到精通
  7. 作者:李文静,山东农业信息中心助理农经师。
  8. wpf tabitem 点击事件_Mindfusion教程:WPF中的Fishbone(Ishikawa)图
  9. Setimer和Ontimer的使用
  10. Kubernetes 小白学习笔记(32)--kubernetes云原生应用开发-sidecar注入和istio服务治理演示
  11. oracle12c安装详解,Oracle12C安装教程
  12. AGV机器人RFID传感器CK-G06A与西门子1200PLC应用手册
  13. 怎样计算计算机的硬盘大小,硬盘容量大小计算的办法
  14. 其实IPv6,并不是那么完美
  15. linux下的chm阅读器?
  16. Activity类的7个生命周期方法
  17. Anaconda 修改文件保存路径
  18. matlab命令行窗口显示长度设置_设置命令行窗口输出显示格式 | MATLAB format| MathWork...
  19. 近两日学的Linux系统基础命令总结
  20. 【Alpha阶段】第四次scrum meeting

热门文章

  1. python语法使用方法_Python语法基础
  2. 选择排序及其不稳定性介绍
  3. html取json列表长度,js获取json元素数量的方法
  4. WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
  5. HTML:页面布局和背景
  6. 深度学习笔记_卷积神经网络参数计算
  7. 机器学习笔记【二】逻辑回归与分类(1):逻辑回归参数更新规则以及pytorch实现
  8. LIO-SAM探秘第二章之安装编译与参数配置
  9. 基于DIou改进的YOLOv3目标检测
  10. 企业落地Kubernetes的问题与对策