携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
往期内容
前言
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
图示(来源网络)
算法实现
算法描述
- 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
- 重复以上步骤,直到整个数组有序
算法实现
public static void insert(int[] a) {
// i 代表待插入元素的索引
for (int i = 1; i < a.length; i++) {
// 代表待插入的元素值
int t = a[i];
int j = i;
System.out.println("第" + j + "轮");
while (j >= 1) {
// j-1 是上一个元素索引,如果 > t,后移
if (t < a[j - 1]) {
a[j] = a[j - 1];
j--;
} else {
// 如果 j-1 已经 <= t, 则 j 就是插入位置
break;
}
}
a[j] = t;
System.out.println(Arrays.toString(a) + " 替换索引位置:" + j);
}
}
测试代码
public static void main(String[] args) {
int[] array = {1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20};
insert(array);
}
运行结果
第1轮
[1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:1
第2轮
[1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:2
第3轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:1
第4轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:4
第5轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:5
第6轮
[1, 3, 8, 35, 40, 49, 60, 47, 48, 11, 20] 替换索引位置:2
第7轮
[1, 3, 8, 35, 40, 47, 49, 60, 48, 11, 20] 替换索引位置:5
第8轮
[1, 3, 8, 35, 40, 47, 48, 49, 60, 11, 20] 替换索引位置:6
第9轮
[1, 3, 8, 11, 35, 40, 47, 48, 49, 60, 20] 替换索引位置:3
第10轮
[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60] 替换索引位置:4
与选择排序比较
- 二者平均时间复杂度都是
- 大部分情况下,插入都略优于选择
- 有序集合插入的时间复杂度为
- 插入属于稳定排序算法,而选择属于不稳定排序
大家多多讨论学习salute