定义
一个有序数组,插入数据后,仍然要保证有序,我们该怎么做?其实很简单,我们只需要遍历数组,找到数据应该插入的位置将其插入即可。
排序过程
将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,排序结束。
图解
时间复杂度
如果要排序的数据已经是有序的,我们并不需要搬移任何数据。如果我们从尾到头在有序数据组里面查找插入位置,每次只需要比较一个数据就能确定插入的位置。所以这种情况下,最好是时间复杂度为 O(n)。注意,这里是从尾到头遍历已经有序的数据。如果数组是倒序的,每次插入都相当于在数组的第一个位置插入新的数据,所以需要移动大量的数据,所以最坏情况时间复杂度为 O(n2)。
空间复杂度
从实现过程可以很明显地看出,插入排序算法的运行并不需要额外的存储空间,所以空间复杂度是 O(1),也就是说,这是一个原地排序算法。
代码实现
public static void insertionSort(String[] args) {
int n = arrPre.length;
if (n <= 1) {
return;
}
for (int i = 1; i < n; ++i) {
int value = arrPre[i];
int j = i - 1;
// 查找插入的位置
for (; j >= 0; --j) {
if (arrPre[j] > value) {
arrPre[j+1] = arrPre[j]; // 数据移动
} else {
break;
}
}
arrPre[j+1] = value; // 插入数据
}
for (int e : arrPre) {
System.out.print(e);
}
}