引言
「插入排序 insertion sort」是一种简单的排序算法,它的工作原理与手动整理一副牌的过程非常相似。
原理
插入排序的基本思想是:每次从未排序的元素中取出一个元素,将其插入到已排序元素的适当位置,直到所有元素都有序。具体来说,我们在未排序区间选择一个基准元素,将该元素与其左侧已排序区间的元素逐一比较大小,并将该元素插入到正确的位置。如图展示了数组插入元素的操作流程。设基准元素为 base ,我们需要将从目标索引到 base 之间的所有元素向右移动一位,然后再将 base 赋值给目标索引。
算法流程
插入排序的整体流程如图所示。
- 初始状态下,数组的第 1 个元素已完成排序。
- 选取数组的第 2 个元素作为 base ,将其插入到正确位置后,数组的前 2 个元素已排序。
- 选取第 3 个元素作为 base ,将其插入到正确位置后,数组的前 3 个元素已排序。
- 以此类推,在最后一轮中,选取最后一个元素作为 base ,将其插入到正确位置后,所有元素均已排序。
代码展示
public static void main(String[] args) {
int[] nums = {4,1,3,1,5,2};
insertSort(nums);
for (int i : nums) {
System.out.print(i+" ");
}
}
public static void insertSort(int[] a){
// 外循环:已排序元素数量为 1, 2, ..., n
for(int i=1;i<a.length;i++){
int base=a[i],j=i-1;
// 内循环:将 base 插入到已排序部分的正确位置
while (j>=0&&base<a[j]){
a[j+1]=a[j];// 将 nums[j] 向右移动一位
j--;
}
a[j+1]=base;// 将 base 赋值到正确位置
}
}