希尔排序是一种改进的插入排序算法,也称为缩小增量排序。它通过将待排序的数组按照一定的间隔分割成若干个子序列,然后对这些子序列进行插入排序,随着排序进行,逐渐减小间隔,直至间隔为1,最后对整个数组进行一次插入排序。这样做的好处是,在初始阶段,子序列中的元素较少,插入排序的代价较小,而且数组中的元素已经基本有序,这样一来,后续的插入排序效率就会提高。
希尔排序的步骤如下:
- 选择一个增量序列,一般选择增量序列为n/2, n/4 , … , 1,其中n为数组的长度。
- 按照增量序列对数组进行分组,分成若干个子序列。
- 对每个子序列进行插入排序。
- 缩小增量,重复步骤2和3,直至增量为1。
下面是用Java实现的希尔排序示例代码:
public class ShellSort {public static void shellSort(int[] arr) {int n = arr.length;// 初始增量设定为数组长度的一半,依次递减, 这里的 /2 可以用 >>1 替代,性能更佳for (int gap = n / 2; gap > 0; gap /= 2) {// 对每个子序列进行插入排序for (int i = gap; i < n; i++) {int temp = arr[i];int j = i;// 插入排序while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}arr[j] = temp;}}}public static void main(String[] args) {int[] arr = {5, 4, 1, 3, 2, 6, 8, 7, 9};System.out.println("排序前数组:" + Arrays.toString(arr));shellSort(arr);System.out.println("排序后数组:" + Arrays.toString(arr));}
}