系列文章目录
提示: 以下是其他排序算法的链接🔗
文章目录
- 系列文章目录
- 希尔排序是什么?
希尔排序是什么?
希尔排序(Shell Sort)是一种基于插入排序的排序算法,也被称为缩小增量排序。希尔排序通过将待排序的元素分组,然后逐步缩小增量,对每个分组进行插入排序,最终完成整个序列的排序。
希尔排序的步骤如下:
- 首先,选择一个增量序列(通常是递减的),用于确定分组的间隔。常用的增量序列有希尔增量序列(n/2, n/4, n/8, …)和Hibbard增量序列(1, 3, 7, 15, …)等。
- 根据选定的增量,将待排序的元素分成多个分组,每个分组包含相隔增量个位置的元素。
- 对每个分组进行插入排序,即将每个分组中的元素按照插入排序的方式进行排序。(也就是说希尔排序是插入排序的优化版本)
- 缩小增量,重复步骤2和步骤3,直到增量为1。
- 最后,进行一次增量为1的插入排序,完成整个序列的排序。
希尔排序的关键在于选择合适的增量序列。较大的增量可以快速减少序列中的逆序对数量,从而提高排序效率。而较小的增量可以保证序列在最后一轮排序时已经基本有序,减少插入排序的比较和交换次数。
希尔排序的时间复杂度取决于增量序列的选择,最坏情况下为O(n^2),但在平均情况下可以达到O(n log n)的性能。
代码模板(示例):
class Solution {
public int[] sortArray(int[] nums) {
shellSort(nums);
return nums;
}
/**
* 希尔排序,是对插入排序的优化(即先让部分元素有序,将大数和小数分布与左右)
* 不稳定
* O(NlogN)
*/
public static void shellSort(int[] arr) {
int n = arr.length;
for (int gap = n / 2; gap > 0; gap /= 2) {// 步长可以自定义,一般是 /2
// 将插入排序的代码中的 1 替换为 gap 即可
for (int i = gap; i < n; i++) {
int index = i - gap;
int indexVal = arr[i];
while (index >= 0 && indexVal < arr[index]) {
arr[index + gap] = arr[index];
index -= gap;
}
arr[index + gap] = indexVal;
}
}
}
}