介绍:
类似人们整理桥牌的方式,将每一张牌插入到其他已经有序的牌中的适当位置。
尽管对大型数组排序时要比很多高级的排序算法(快速排序, 堆排序, or 归并排序)效率低 。然而插入排序仍有以下几点优势[1] .
- 实现简单
- 稳定的排序算法
- 原地排序算法;O(1)空间占用。
- 在线排序;可以依次的读取元素进行排序
总的来说,插入排序对于部分有序的数组十分高效,也适合小规模数组。经常用于高级排序算法的中间过程。
算法描述
数组被分为两部分-排序的和未排序的。一开始,排序部分只包含第一个元素,未排序部分则是其他所有元素。在每一次迭代过程中,算法找到未排序部分的第一个元素插入到已排序的数组中合适的位置上。当未排序部分为空时,算法结束。示意图如下[2].
举个例子:以下是{7, -5, 2, 16, 4}的排序过程[1]
复杂度分析
时间:最优是O(1),平均和最差都是O(n²).
空间:O(1).
是稳定的排序算法。
插入排序代码
void insertionSort(int[] arr) {
int i, j, newValue;
for (i = 1; i < arr.length; i++) {
newValue = arr[i];
j = i;
while (j > 0 && arr[j - 1] > newValue) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = newValue;
}
}
参阅
[1]Insertion sort-Wikipedia https://en.wikipedia.org/wiki/Insertion_sort
[2]Insertion Sort http://www.algolist.net/Algorithms/Sorting/Insertion_sort