1. 思想
直接插入排序就是 打牌中抓牌插入的过程。(一般人都会整理为从小到大的序列)
思想:按照数据的大小插入到有序队列的合适位置。
2. 图解过程
例1
例2
3. 算法分析
排序类别 | 排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均情况 | 最坏情况 | 最好情况 | |||||
插入排序 | 直接插入排序 | O(N²) | O(N²) | O(N) | O(1) | 稳定 | 简单 |
时间复杂度:
当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。
当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N²)。
所以,数据越接近正序,直接插入排序的算法性能越好。
4. Code in JAVA
public class InsertSort {
//插入排序方法
public static void insertSort(int[] array){
for (int i = 1; i < array.length; i++) {
//从第二位开始遍历数组,Key 对应图解过程红色数据
int key = array[i];
int j = i - 1;
//遍历数组下标i之前的数据,如果大于当前值,则后移一位
for(;j >= 0 && array[j] > key;j--){
array[j + 1] = array[j];
}
//直至遍历到最前一位,或者当前值小于遍历值,将当前值插入当前位置的后一个位置
array[j+1]=key;
}
}
public static void printArray(int[] array) {
System.out.print("{");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]);
if (i < array.length - 1) {
System.out.print(", ");
}
}
System.out.println("}");
}
public static void main(String[] args) {
int[] array = { 9,3, 1, 4,2,7,8,6,5 };
insertSort(array);
printArray(array);
}
}
5. 参考引用
图解过程引自 作者: dreamcatcher-cx
https://www.cnblogs.com/chengxiao/p/6103002.html
和
http://www.cnblogs.com/xwz0528/p/4557743.html
分析引自 静默虚空