简介:百度说:希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
一、核心思想
希尔排序核心思想就是:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。(希尔排序相当与普通插入排序的升级版,只不过是多了增量分组的过程)(如下图实例)
二、实例
图片截至:https://www.bilibili.com/video/BV1B4411H76f?p=63&vd_source=a324c81d0edc7a9cbb08964c090285e4
三、代码实现(java)
public class Sort {
/**
* 希尔排序(位移法)(插入排序的一种更高效的方法)
* @param nums
* @return
*/
public int[] shellSort(int[] nums) {
//数组首先分成nums.length / 2 组
int t = nums.length / 2;
//分组每次减少两倍,直到变为一组
while (t >= 1) {
//处理每一组
for (int i = t; i < nums.length; i++) {
//当前分组待插入数
int insertNum = nums[i];
//当前分组待插入数前一个数下标
int insertIndex = i - t;
while (insertIndex >= 0 && nums[insertIndex] > insertNum) {
//当前分组待插入数前一个数大于待插入数,,待插入数在待插入数前一个数前面,待插入数前一个数向后移动一位。
nums[insertIndex + t] = nums[insertIndex];
//当前分组待插入数再与前前一个数比较,循环往复
insertIndex -= t;
}
//当前分组循环结束,(1)要么是insertIndex == 负数 及这个数是有序数组中最小的,他就是当前分组数组第一个数咯
//(2)要么是nums[insertIndex] <= insertNum 及待插入数前一个数比待插入数小,那么insertIndex + t就是这个数该在的下标
nums[insertIndex + t] = insertNum;
}
t = t / 2;
}
return nums;
}
}