概述
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
平均时间复杂度
平均时间复杂度为O(n^2)
算法稳定性
是稳定的排序方法。能保证序列 [2, 5, 3, 5] 之间的顺序。
示例代码
/**
* 插入排序
* @author 吴庆龙
* Date: 2018/8/2
* Time: 9:54
*/
public class InsertSort {
public static void main(String[] args) {
int[] array = {7,3,2,4,1,8,0,9,5,6};
sort(array);
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
}
private static void sort(int[] array) {
// 获取最右边的下标
int right = array.length - 1;
for (int i = 1; i <= right; i++) {
int key = array[i]; // 待排序的值
int last = i - 1; // 已排序数组最大值的索引
// 从最大值开始比较, 如果不成立, 则该位置即为应插入的位置, 退出循环
for (; last >= 0; last--) {
if (key <= array[last]) {
array[last + 1] = array[last];
} else {
break;
}
}
// 元素放入数组中
array[last+1] = key;
}
}
}
插入排序是稳定的排序,取出待排序的数字,从已排序数组的最后一个数开始比较,如果待排序的数字小,则使用前一位数覆盖当前位的数。直到遇到比自己小的数
内部的查找最小(最大)数的遍历可以优化为二分查找