本文欢迎转载,转载前请联系作者,经允许后方可转载。转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSDN
一.什么是插入排序?
插入排序(insertion sort)是最简单的排序算法之一。它是一个稳定的排序算法。
(Tips:所谓稳定,即两个相同元素,排序前和排序后他俩的顺序不发生改变。当然,这跟具体实现有一定关系。)
如果一个数组由N个元素组成,则插入排序由N - 1趟排序组成。对于p = 1到N - 1趟,插入排序保证从位置0到位置p上的元素为已排序状态。
即第一趟,从下标1处元素进行排序,保证数组0~1位置上的元素有序。
第二趟,从下标2处元素进行排序,保证数组0~2位置上的元素有序。
……
第N - 1趟,从下标N - 1处元素进行排序,保证数组0~N - 1位置上的元素有序。到此,整个数组排序完毕。
二.插入排序的举例实践
对于数组[46, 34, 32, 12, 14, 9]
- p = 1趟之后:[34, 64, 32, 12, 14, 9]
- p = 2趟之后:[32, 34, 64, 12, 14, 9]
- p = 3趟之后:[12, 32, 34, 64, 14, 9]
- p = 4趟之后:[12, 14, 32, 34, 64, 9]
- p = 5趟之后:[9, 12, 14, 32, 34, 64]
三.插入排序复代码实现
InsertionSort.java
public class InsertionSort {
/**
* InsertionSort 插入排序
*
* @param arr 被排序的数组
* @param <T>
*/
public static <T extends Comparable<? super T>> void insertionSort(T[] arr) {
int p;
for (int i = 1; i < arr.length; i++) {
// 储存当前访问的节点值
T tmp = arr[i];
for (p = i; p > 0 && tmp.compareTo(arr[p - 1]) < 0; p--) {
// 如果tmp小于arr[p - 1]的值,则后移一位
arr[p] = arr[p - 1];
}
// 将tmp替换p位置的值(上面的for已经将原来的p后移了)
arr[p] = tmp;
}
}
}
InsertionSortTest.java 测试类
public class InsertionSortTest {
public static void main(String[] args) {
Integer[] arr = {46, 34, 32, 12, 14, 9};
InsertionSort.insertionSort(arr);
print(arr);
}
private static <T> void print(T[] arr) {
for (T t : arr) {
System.out.print(t.toString() + " ");
}
System.out.println();
}
}
测试数组:[46, 34, 32, 12, 14, 9]
输出:9 12 14 32 34 46
四.插入排序算法复杂度分析
最坏情况,数组为倒序,嵌套循环的每次循环都要消耗N次迭代,因此插入排序的时间复杂度为O(N²)。
理想情况下,如果数组已经是排序好的情况,时间复杂度则为O(N)。
插入排序过程使用了i、p、tmp三个辅助变量,与问题规模无关,所以空间复杂度为O(1)。
有关[数据结构与算法]的学习内容已经上传到github,喜欢的朋友可以支持一下。 https://github.com/MaYuzhe/data-structures-and-algorithm-study-notes-java
站在前人的肩膀上前行,感谢以下博客及文献的支持。
- 排序算法总结之插入排序
- 图解插入排序–直接插入排序
- 《数据结构与算法分析(第3 版) 工业出版社》