Java排序算法——插入排序(Insertion Sort)
之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~
往期传送门:
冒泡排序:
Java排序算法——冒泡排序(Bubble Sort)https://blog.csdn.net/babbfqb93/article/details/123005968简单选择排序:
Java排序算法——选择排序(Selection Sort)https://blog.csdn.net/babbfqb93/article/details/123040023插入排序(Insertion Sort)一般也被称为直接插入排序或者简单插入排序,之所以这样,是因为我们一般把排序算法分为比较类排序与非比较类排序,而比较类排序又可以分为交换排序、插入排序、选择排序与并归排序。整体如下图:
我们已经讲过了冒泡排序与选择排序(简单选择排序),可以明确感觉的出来,冒泡排序——交换排序,可以看出来是每个比较,之后进行交换。简单选择排序,我们先“选择”需要交换的元素,然后交换,再进行交换这种方式进行排序。现在我们要总结的简单插入排序,则和之前又有所不同。
插入排序,故名思意,是一种“插入”的排序。我们视同原始数据为“无序数组”,将“无序数组”的元素,逐个将元素。插入到“有序数组”中,这一句话总结,可能不太能好理解,所以我们先看一下整体的实现。先把整体的图给大家看一下效果:(最后一栏出现“插入”字符串,说明进行了插入操作)。
我们先看一下第一行的数据,用它作为例子
第一步(分析):
原始数组,我们默认数组的第一个元素视同一个长度为1的“有序数组”,毕竟他就一个元素,怎么看都是有序的。接下来我们把剩余的数组视同为无序的。
第二步(获取需要比较的元素):
“红色标记”为我们要比较的元素,我们获取第一个“无序数组”的元素“20”,它是我们本次循环需要被比较的数字。
第三步(获取被比较的元素):
“黄色标记”为我们被比较的元素,它的取数逻辑是从“有序数组”的最后一个元素开始,如本次比较,“40”就是我们被比较的数字。
第四步(比较):
如果“红色”比“黄色”大,则记录下当前“黄色”的下标位置,如果结果是小,则继续和“黄色“的上一位比较,直到找到比“红色”小的“黄色”来记录下标或者遍历完整个“有序数组”。
第五步(插入):
将“红色”插入到记录下的坐标位置,如果没有记录的位置,则视同位置为数组的起点“0”下标。
以上5步可以理解为插入排序的一个内层循环,我们可以用代码将其实现,实现代码如下:
生成随机数方法和之前的方法都是一致的:
//初始换一个长度为参数的随机数组,数组元素为0(含)到50(不含)的随机数
public static int[] initArray(int length){Random r = new Random();//申明并实例化一个Random对象int[] iArray = new int[length];//申明并实例化一个int数组用于测试排序for (int i = 0; i < iArray.length; i++) {//通过Random随机生成一个0(含)到50(不含)的数并插入对应位置iArray[i] = r.nextInt(50);}return iArray;
}
插入方法,插入方法和之前的交换方法不相同,我们的插入不是简单的交换,而是将之前的数字向后移动一位,直到到需要插入的位置,将数值插入进去:
//将下标为i的元素插入到下标为j的元素
public static void swap(int[] iArray,int i,int j){//先将j下标位置存储int temp = iArray[i];//当i>j的时候需要循环,直到j与i坐标相当,每次将j之前一个数向后移动一位,j--for(;i>j;i--){iArray[i]=iArray[i-1];}//最后将i下标设置成被插入数的值iArray[j]=temp;
}
简单插入排序第一层循环逻辑:
public static void insertionSort(int[] iArrays){//默认和0进行交换int index = 0;//被比较的数(“红色”)int temp = iArrays[0 + 1];//遍历之前的“有序数组”,从总循环次数+1开始遍历for (int j = 0+1; j >0; j--) {//如果需比较的数字大于之前的某一个元素,记录元素的下标用于插入if(temp >iArrays[j-1]){index = j;}}//插入交换swap(iArrays,0+1,index);}
这就是第一次的循环,接下来我们需要的就是让所有的数都会被遍历到,并且按照之前的5步走,那么就是将循环次数再次嵌套一层循环,循环的起点是从第0个下标位置开始,终点为数组的最后一个数字之前一位(内层循环会将该次数+1(int j = i+1)所以条件的终点应该是数组长度-1),加上之后讲之前的0改成外层循环变量i就实现了。
public static void insertionSort(int[] iArrays){//循环整体数据for(int i =0;i<iArrays.length-1;i++) {//默认和0进行交换int index = 0;//被比较的数(“红色”)int temp = iArrays[i + 1];//遍历之前的“有序数组”,从总循环次数+1开始遍历for (int j = i + 1; j > 0; j--) {//如果需比较的数字大于之前的某一个元素,记录元素的下标用于插入if ( temp > iArrays[j - 1]) {index = j;//因为之前为有序的所以记录坐标就可以break了break;}}//插入交换swap(iArrays, i + 1, index);}
}
我们写个测试入口测试一下:
public static void main(String[] args) {//初始化数组int[] iArray = initArray(7);//输出排序前结果System.out.println("------排序之前------");System.out.println(Arrays.toString(iArray));System.out.println("-------------------");//排序...System.out.println("------正在排序------");insertionSort(iArray);System.out.println("-------------------");//输出排序后结果System.out.println("------排序之后------");System.out.println(Arrays.toString(iArray));System.out.println("-------------------");
}
实现结果:
不过代码还是比较复杂的,我这里是为了更加直接的展示出“插入”与“比较”的不同,其实有更加优化的方法,代码优化的博客也写好了,可以参考一下链接
开个门:
Java排序算法——插入排序(Insertion Sort)代码优化https://blog.csdn.net/babbfqb93/article/details/123062970
引用一下个人查询到的相关gif,帮助大家总结一下(我实在找不到gif的作者,这个图用于学习真的很棒!感谢gif图作者)
好,我说完了。
Java排序算法——插入排序(Insertion Sort)相关推荐
- C语言插入排序Insertion Sort算法(附完整源码)
插入排序Insertion Sort算法 插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 插入排序Insertion Sort算法的完整源码(定义,实现,main函 ...
- python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- python sort 逆序_python实现·十大排序算法之插入排序(Insertion Sort)
简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...
- 排序算法---插入排序(java版)
直接插入排序 原理 直接插入排序(Insertion Sort)的原理是:将数组中的数据分为两个区间,已排序区间和未排序区间.初始已排序区间只有一个元素,就是数组的第一个元素.插入算法的核心思想是取未 ...
- [转载] python实现基本算法之插入排序(Insertion Sort)
参考链接: Python中的插入排序insertion sort 基本算法之插入排序(Insertion Sort) 基本算法-02.插入排序(Insertion Sort)算法 冒泡排序已经发布,大 ...
- 插入排序(Insertion Sort)-Java实现
插入排序(Insertion Sort)算法简介: 插入排序是一种丛序列左端开始依次对数据进行排序的算法.在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据. 插入排序(Inserti ...
- C语言以递归实现插入排序Insertion Sort算法(附完整源码)
以递归实现插入排序Insertion Sort算法 以递归实现插入排序Insertion Sort算法的完整源码(定义,实现,main函数测试) 以递归实现插入排序Insertion Sort算法的完 ...
- java排序算法(插入排序,冒泡排序,选择排序)
java排序算法(插入排序,冒泡排序,选择排序) 先了解原理,然后自己跟着敲一下,加深印象 CMD编译命令:javac -encoding utf-8 SortList.java && ...
- 【Java】基础排序算法-插入排序
基础排序算法-------插入排序 实现过程: 插入排序的过程就像整理桥牌的过程:每次将待排元素中的第一个元素插入到有序区间的合适位置,为了给当前待排元素腾出位置,需要将有序区间内所有大于待排元素的其 ...
最新文章
- ORB_SLAM2代码阅读(1)——系统入口
- 链路 英文_光纤链路基础
- android运行内存与存储内存,运行内存和机身内存的区别 这些知识你知道吗
- python字符串前加r、f、u、l 的区别
- java只使用try和finally不使用catch的原因和场景
- android bu,Android请求权限之不再询问或禁止不再提示
- java的标识符可以以数字开头_标识符可以以数字开头,但不能是Java中的关键字...
- 实时视频流(url)——延时显示
- asp. net sql网上书店管理系统设计作品
- 10个JavaScript常见BUG及修复方法 1
- Linux Platform驱动模型(三) _platform+cdev
- 常用原型图绘制工具比较
- 机器码解除教程,逃离塔科夫机器码解除,彩虹6号机器码解除,dayz机器码解除,腐蚀rust机器码解除
- 小活动大收获,大叔做烧烤摊,两周收款10万,竟如此简单!
- webpack与ts版本不兼容
- Ubuntu 18.04刷机问题汇总
- OpenStack使用Placement做资源管理时虚拟机无法调度的一次排错记录
- 火柴人生存挑战2html5游戏在线玩,火柴人生存挑战
- 第一天使用 csdn
- 西安未来国际java,新开工!西安文化CBD国际商业中心来了!2020 级重点建设项目发布...
热门文章
- 使用IBM Data Movement Tool 具体迁移oracle至db2实验
- Informatica的FTP功能如何使用|infa怎么实现ftp文件自动上传
- 西门子S7-1200组态PROFINET
- 圆形比例分布图怎么做_使用PPT制作环形比例图的方法
- aggregate vs treeAggregate
- 《缠中说禅108课》8:投资如选面首,G 点为中心,拒绝 ED 男
- 写给嵌入式程序员的循环冗余校验(CRC)算法入门引导
- @ConfigurationProperties报错问题
- HTML5七夕情人节表白网页(幻化3D相册) HTML+CSS+JavaScript 求婚示爱代码 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心表白
- mybatis什么时候用的${}