数据结构与算法------插入排序
插入排序
插入式排序属于内部排序法,对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
排序思想
把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}
结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.
那么如何优化插入排序呢?=====>希尔排序
这就是插入排序(直接插入排序),有什么地方说错了,说的不好,大家可以交流下
数据结构与算法------插入排序相关推荐
- Java数据结构与算法——插入排序
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...
- JS数据结构与算法——插入排序
一.图解排序过程 二.代码实现 三.完整代码 <!DOCTYPE html> <html lang="en"> <head><meta c ...
- Python 数据结构与算法 —— 插入排序
本文你将学会如下的要点: 使用 Python 语言进行算法设计时,和 C 语言实现相比,需要注意哪些问题 如何尽可能少地利用辅助空间,因为在 Python 编程环境中,定义一个 list实在是唾手可得 ...
- Python 数据结构与算法——插入排序(insertion sort)
我们先归纳性地假设前 n−1n-1 个元素已经完成排序,现在要将第 n<script id="MathJax-Element-2" type="math/tex&q ...
- java数据结构排序实验报告_java数据结构与算法之插入排序详解
本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...
- 数据结构与算法之插入排序
数据结构与算法之插入排序 目录 插入排序介绍 插入排序思路分析 代码实现 1. 插入排序介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的. 2. 插 ...
- 数据结构与算法:十大排序算法之插入排序
数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...
- 数据结构与算法:冒泡排序、插入排序、选择排序
排序算法太多了,有很多可能你连名字都没听说过,比如猴子排序.睡眠排序.面条排序等.本文只众多排序算法中的一小撮,也是最经典的.最常用的:冒泡排序.插入排序.选择排序.归并排序.快速排序.计数排序.基数 ...
- python数据结构与算法总结
python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...
- 数据结构与算法:22 精选练习50
精选练习50 马上就要期末考试或者考研了.为了大家复习的方便,我精选了有关数据结构与算法的50道选择题,大家可以抽空练习一下.公众号后台回复"答案"可以获取该50道题目的答案. 0 ...
最新文章
- C#是否该支持“try/catch/else”语法
- k8s kafka集群 连接不上_图解 K8s 核心概念和术语
- JS 版的pnp in_array($str,$arr)
- DotNet Framework 版本历史
- Spring boot拦截器登录检查
- 【Github教程】史上最全github用法:github入门到精通
- 作者:李文静,山东农业信息中心助理农经师。
- wpf tabitem 点击事件_Mindfusion教程:WPF中的Fishbone(Ishikawa)图
- Setimer和Ontimer的使用
- Kubernetes 小白学习笔记(32)--kubernetes云原生应用开发-sidecar注入和istio服务治理演示
- oracle12c安装详解,Oracle12C安装教程
- AGV机器人RFID传感器CK-G06A与西门子1200PLC应用手册
- 怎样计算计算机的硬盘大小,硬盘容量大小计算的办法
- 其实IPv6,并不是那么完美
- linux下的chm阅读器?
- Activity类的7个生命周期方法
- Anaconda 修改文件保存路径
- matlab命令行窗口显示长度设置_设置命令行窗口输出显示格式 | MATLAB format| MathWork...
- 近两日学的Linux系统基础命令总结
- 【Alpha阶段】第四次scrum meeting