前言
大家好,牧码心今天给大家推荐一篇数据结构与算法系列(四)—插入排序的文章,希望对你有所帮助。大纲如下:
- 插入排序基本介绍
- 插入排序图文说明
- 插入排序时空复杂度和稳定性
- 插入排序具体实现
插入排序基本介绍
插入排序 是一种较简单的排序算法,排序过程类似于打扑克牌,将手中的牌进行排序,举个例子,比如我手中有黑桃6,7,9,10这四张牌,此时我又抓到了一张黑桃8,自然会在已经有序的四张牌中找到黑桃8应该插入的位置,也就是7和9之间,把黑桃8插入进去完成排序。其基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。。
插入排序图文说明
- 下面以数列{20,40,30,10,60,50}为例,演示插入排序过程
排序流程说明:- 给定无序数组{20,40,30,10,60,50},从小到排序,并把数组的首元素20作为有序区,此时有序区只有这一个元素:
- 第1趟:让元素30与有序区比较,20<30 ,无交换。此时有序去增加到2个元素:20,30
- 第2趟:让元素40与有序区比较,30<40 ,无交换;20<40,无交换。此时有序去增加到3个元素:20,30,40
- 第3趟:让元素10与有序区比较,40>10 ,交换;30>10,交换;20>10 交换。此时有序去增加到4个元素:10,20,30,40
- 以此类推,插入排序一共会进行(数组长度-1)轮比较
- 给定无序数组{20,40,30,10,60,50},从小到排序,并把数组的首元素20作为有序区,此时有序区只有这一个元素:
插入排序时空复杂度和稳定性
时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|
O(n^2) | O(1) | 稳定 |
- 说明
- 时间复杂度:假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,直接插入排序的时间复杂度是O(N2)。;
- 空间复杂度 :选择排序是原地排序,没有产生额外的空间,则为O(1) ;
插入排序实现
- 插入排序(java版)
/**
* @Author:greekw
* @Desc: 插入排序:维护一个有序区,将元素一个一个插入到有序区适当的位置,直到所有元素有序。类比:玩扑克
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
* @Date 0:07 2020/7/22
* @Param [array]
* @return void
**/
public static void insertSort(int[] array){
for(int i = 1;i < array.length;i++){
// 将需要比较的元素放入暂存区
int insertValue = array[i];
int j = i-1;
// 与前面i-1个元素进行比较
for (; j>=0 && insertValue < array[j]; j--) {
array[j+1] = array[j];
}
array[j+1] = insertValue;
}
}
// 测试用例
public static void main(String[] args) {
int[] selectArray= new int[]{20,40,30,10,60,50};
insertSort(selectArray);
System.out.println(Arrays.toString(selectArray));
}
欢迎关注我的公众 号(牧码心),获取很多精彩文章和学习资料!