一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
前言
在前面的文章我们介绍了冒泡排序,但是冒泡排序不是我们的常用排序算法的,我们的常用算法的是插入排序。插入排序在大多数场景下,性能都是优于冒泡排序的。
插入排序
那么我们来介绍一下插入排序的概念,插入排序就是一个动态排序的过程的,遍历数组中的每个元素,我们拿对应的元素进行比较,去寻找它应该存放的位置,找到之后,它之前的元素统一向后移动一位。然后把空出来的位置,存放这个元素即可。我们将数组中的数据分为两个区间,已排序区间和未排序区间。我们默认初始的已排序区间就是第一个元素,核心思想就是取未排序的区间的数据,去已排序的区间进行比较,查找对应的合适的插入位置将其进行插入。这样可以保证已排序的区间数据是一直有序的,然后我们重复这个过程,直到未排序区间中的元素为空。排序就完成了。插入排序也涉及了两种操作,一种是元素的比较,另一种操作是元素的移动。因为我们需要拿未排序空间的数据元素去已排序区间元素的元素依次比较大小,找到合适位置插入后,还需要将插入点之后的元素元素顺序往后移动一位,这样才能腾出位置给数据元素进行插入。我们从不同的查找插入点的方法,数据元素进行比较的次数是有区别。 插入排序的代码模版
public void insertionSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 1; i < n; ++i) {
int value = a[i];
int j = i - 1;
for (; j >= 0; --j) {
if (a[j] > value) {
a[j+1] = a[j];
} else {
break;
}
}
// 插入数据
a[j+1] = value;
}
}
总结
插入排序是原地算法也是稳定的算法的。