目录
一、简介
算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
插入排序 | O(n^2 ) | O(n) | O(n^2) | O(1) | In-place | 稳定 |
稳定:如果A原本在B前面,而A=B,排序之后A仍然在B的前面;
不稳定:如果A原本在B的前面,而A=B,排序之后A可能会出现在B的后面;
时间复杂度: 描述一个算法执行所耗费的时间;
空间复杂度:描述一个算法执行所需内存的大小;
n:数据规模;
k:"桶"的个数;
In-place:占用常数内存,不占用额外内存;
Out-place:占用额外内存。
算法步驟:
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
二、代码实现
java
public class InsertionSort {
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int val = arr[i], j = i;
while (j > 0 && val < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = val;
}
}
public static void insertionSort2(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int val = arr[i], j = i;
while (j > 0 && val > arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = val;
}
}
public static void main(String[] args) {
int[] arr = {12, 11, 15, 50, 7, 65, 3, 99};
System.out.println("---排序前: " + Arrays.toString(arr));
insertionSort(arr);
System.out.println("从小到大插入排序后: " + Arrays.toString(arr));
insertionSort2(arr);
System.out.println("从大到小插入排序后: " + Arrays.toString(arr));
}
}
三、应用场景
插入排序时间复杂度是 O(n^2),适用于数据量不大,算法稳定性要求高,且数据局部或整体有序的数列排序。
参考链接:
十大经典排序算法(Java实现)