核心:通过构建有序序列,对于未排序序列,在已排序序列中从后向前扫描(对于单向链表则只能从前往后遍历),找到相应位置并插入。实现上通常使用in-place排序(需用到O(1)的额外空间)
public class InsertionSort { public static void main(String[] args) { int unsortedArray[] = new int[]{6, 5, 3, 1, 8, 7, 2, 4}; insertionSort(unsortedArray); System.out.println("After sort: "); for (int item : unsortedArray) { System.out.print(item + " "); } } public static void insertionSort(int[] array) { int len = array.length; for (int i = 0; i < len; i++) { int index = i, array_i = array[i]; while (index > 0 && array[index - 1] > array_i) { array[index] = array[index - 1]; index -= 1; } array[index] = array_i; /* print sort process */ for (int item : array) { System.out.print(item + " "); } System.out.println(); } } }
输出:
6 5 3 1 8 7 2 4 5 6 3 1 8 7 2 4 3 5 6 1 8 7 2 4 1 3 5 6 8 7 2 4 1 3 5 6 8 7 2 4 1 3 5 6 7 8 2 4 1 2 3 5 6 7 8 4 1 2 3 4 5 6 7 8 After sort: 1 2 3 4 5 6 7 8
核心:基于插入排序,使数组中任意间隔为h的元素都是有序的,即将全部元素分为h个区域使用插入排序。其实现可类似于插入排序但使用不同增量。更高效的原因是它权衡了子数组的规模和有序性。
推荐大佬文章:排序算法 —— 希尔排序(图文超详细)
从网上搞了一个动图
(图网,侵删)