插入排序,也称为直接插入排序,其排序思想和我们平时打扑克牌时排序类似。
1 算法步骤
- 将第一个元素看作已排序序列,第二个到最后一个看作未排序序列。
- 第二个元素,与之前已排序号的序列进行对比,插入正确的位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
- 循环处理剩下的未排序序列。
效果图:
2 复杂度
当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,最优时间复杂度为 O ( n ) O(n) O(n)
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
空间复杂度为 O ( 1 ) O(1) O(1)
3 稳定性
稳定的,数据的相对顺序不会发生改变。
4 代码实现
void insertionSort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
int tmp = a[i + 1];
int j;
for (j = i; j >= 0; j--) {
if (a[j] > tmp) {
a[j+1] = a[j];
} else {
break;
}
}
a[j + 1] = tmp;
}
}
欢迎大家关注、评论、点赞、打赏。
你们的支持是我坚持的动力。Thank you!