文章摘要: 通过比较距离较远的数据来工作,其核心理念是使数组中任意间隔为h的元素都是有序的。
简介
简要说明
- 希尔排序是插入排序的一种更高效的改进版本。
- 通过比较距离较远的数据来工作,其核心理念是使数组中任意间隔为h的元素都是有序的。
- 希尔排序也称递减增量排序,因为它会优先比较距离较远的元素。
主要功能
- 对数组进行排序,通过比较较远距离的元素来减少数据移动次数。
- 逐步缩小比较间隔,最终使用插入排序来完成排序。
注意事项
- 希尔排序的性能很大程度取决于间隔序列的选择,没有最好的序列,不同的序列会有不同的性能。
- 希尔排序不是稳定的排序算法,可能会改变相同元素之间的相对顺序。
适用场景
- 数据量大且部分有序时,希尔排序比简单插入排序更高效。
- 适用于中等大小的数组。
时间复杂度
- 最优情况:取决于间隔序列,通常优于O(n^2)
- 平均情况:取决于间隔序列,通常在O(n^(1.3))到O(n^2)之间
- 最坏情况:O(n^2)
空间复杂度
- O(1),希尔排序是原地排序算法。
Java 8
public class ShellSort {
// 主方法调用希尔排序
public static void main(String[] args) {
int[] array = {64, 34, 25, 12, 22, 11, 90};
shellSort(array);
System.out.println("Sorted array: " + Arrays.toString(array));
}
// 希尔排序方法
public static void shellSort(int[] array) {
int n = array.length;
// 开始时,间隔设置为n/2,然后每次减半,直到间隔为1
for (int gap = n / 2; gap > 0; gap /= 2) {
// 使用插入排序的思想,对间隔为gap的元素进行排序
for (int i = gap; i < n; i++) {
// 将array[i]插入到已排序的间隔序列中
int temp = array[i];
int j;
for (j = i; j >= gap && array[j - gap] > temp; j -= gap) {
array[j] = array[j - gap]; // 移动元素
}
array[j] = temp; // 插入元素到正确的位置
}
}
}
}
注释
在这个Java案例中,shellSort 方法实现了希尔排序算法。首先,设置一个间隔gap,它从数组长度的一半开始,并每次减半,直到间隔为1。然后,对于每个间隔,使用插入排序的思想对间隔为gap的元素进行排序。在内部循环中,将当前元素与其前面的元素进行比较,如果需要,则交换它们的位置。