插入排序(Insertion Sort)的起源并不明确,但它是计算机科学中最早提出的排序算法之一。它的工作原理类似于我们日常整理扑克牌或书籍时的过程:我们创建一个新的有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
插入排序的思想可以扩展到其他更复杂的排序算法中,例如希尔排序(Shell Sort),它实际上是插入排序的一种更高效的改进版本,也称为缩小增量排序。希尔排序通过使用一个增量序列,使得每次排序时,都能将序列中较远的元素提前放到合适的位置,从而为后续的插入操作减少了数据移动量。
优点:
缺点:
插入排序通常用于数据量较小或基本有序的情况,或者作为教学示例来帮助学生理解排序算法的基本概念。由于其稳定性,它也被用于需要保持元素原始顺序的排序任务。
假设有一个数组[4, 2, 8, 3, 1],我们使用插入排序来对其进行升序排序:
public class InsertionSort {
public static void main(String[] args) {
int[] array = {4, 2, 8, 3, 1};
insertionSort(array);
System.out.println(Arrays.toString(array));
}
public static void insertionSort(int[] array) {
int n = array.length;
for (int i = 1; i < n; i++) {
int key = array[i];
int j = i - 1;
// Move elements of array[0..i-1], that are greater than key,
// to one position ahead of their current position
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j = j - 1;
}
array[j + 1] = key;
}
}
}运行上述代码,将输出排序后的数组[1, 2, 3, 4, 8]。