作者平台:
| CSDN:https://blog.csdn.net/qq_41153943(ID:江夏、)
| 掘金:https://juejin.cn/user/651387938290686(ID:jiangxia_1024)
| 知乎:https://www.zhihu.com/people/1024-paper-96(ID:江夏)
| GitHub:https://github.com/JiangXia-1024?tab=repositories
| 微信公众号:1024笔记
本文一共1572字,预计阅读9分钟
前言
前面的文章排序算法系列:详解冒泡排序算法及其java实现和排序算法:详解选择排序算法及其java实现介绍了排序算法中比较经典的冒泡排序和选择排序算法,其中选择排序是非稳定排序算法,而冒泡排序是稳定排序算法,今天一起复习另外一种稳定排序算法:插入排序,这里的排序算法指的是直接插入。
什么是插入排序
直接插入排序的核心逻辑指的是每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。
比如有如下乱序的数组:8,2,6,3,4,5,7,如果使用插入排序对其进行升序排序,那么在一开始有序的数组就只有第一个元素8,后面的元素都是待排序的乱序的数组。
那么第一次排序就是取乱序数组中的第一个元素2,和有序的数组中的元素比较,因为比8小,所以放在8前面。所以第一次排序的结果是2,8,6,3,4,5,7。有序的数组就成了2,8,后面的6,3,4,5,7就成了待排序的乱序数组了。
第二次排序就取6,3,4,5,7中的第一个元素6和有序数组2,8进行比较,从有序序列的后面依次向前比较,首先是8,大于6,则8向后移动。接着比较2和6,2比6小,所以这里将6插在2的后面,也就是原来元素8的位置,元素8已经后移,那么第二次排序的结果是:2,6,8,3,4,5,7。
第三次排序取元素3和有序数组2,6,8依次比较,先和8比较比8小,则8后移,然后6比较,6继续后移,和2比较,比2大,则不动,所以第三次的排序结果是:2,3,6,8,4,5,7。
同理,则第四次排序结果是:2,3,4,6,8,5,7。
第五次的排序结果是:2,3,4,5,6,8,7。
第六次的排序结果是:2,3,4,5,6,7,8。
通过上述的过程可以发现直接插入排序时稳定排序算法。并且该算法的核心逻辑就是比较和移动元素,所以如果一个长度为n的数组本身就是有序数组,那么只需要进行n次的比较,但是并不需要移动元素,此时的时间复杂度为o(n)。那么最差情况下就是数组是倒序的,但是排列是要求正序的,那么此时的时间复杂度为O(N^2)。因为最后一个元素,需要和前面的n-1个元素进行比较,并且前面的n-1的元素都需要后移,以此类推比较和移动的次数都是0+(2-1)+....+(n-1)次,即n(n-1)/2。所以平均时间复杂度是O(N^2)
插入排序的java实现
通过上述对于直接插入排序的分析,可以总结其java的实现如下:
package sort;public class InserSort {//核心代码---开始public static void sort(Comparable[] number){for (int i = 0; i < number.length; i++) {for( int j = i ; j > 0 ; j -- )//元素比较if( number[j].compareTo( number[j-1] ) < 0 )swap(number, j , j-1 );elsebreak;}}//元素替换private static void swap(Object[] arr, int i, int j) {Object t = arr[i];arr[i] = arr[j];arr[j] = t;}public static void main(String[] args) {Integer[] number = {8,2,6,3,4,5,7};sort(number);for( int i = 0 ; i < number.length ; i ++ ){System.out.print(number[i]);System.out.print(' ');}}}
总结
插入排序原理就是比较和移动,将原始数组分为有序数组和待排序数组,每次排序过程都用待排序数组的第一个元素和前面的有序数组进行比较和移动。所以最好情况下的时间复杂度是o(n),最差和平均复杂度都为O(N²)。并且经过插入排序之后相等元素的相对位置并不会发生变化,所以插入排序是稳定排序。
其他推荐
Spring注解(三):@scope设置组件作用域
Spring常用注解大全,值得你的收藏!!!
Spring注解(七):使用@Value对Bean进行属性赋值
SpringBoot开发Restful风格的接口实现CRUD功能
Spring注解(六):Bean的生命周期中自定义初始化和销毁方法的四种方式




