持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。
希尔排序算法
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
算法思路
- 选定一个增量h(一般是数组长度的一半),按照增量h作为数据分组的依据,对数据进行分组。
- 对分好组的每一组数据完成插入排序。
- 减小增量,最小减为1,重复上述第二步。
图解展示
动图演示
代码实现
// 对交换式的希尔排序进优化 -> 移位法
public static void shellSort3(int[] arr){
// 增量gap 并逐步的缩小增量
for(int gap = arr.length/2; gap > 0; gap /= 2){
// 从第 gap 个元素 逐个对其所在的组进行直接插入排序
for (int i = gap; i < arr.length; i++) {
int insertValue = arr[i]; // 要插入的元素
int insertIndex = i - gap; // 定义待插入位置的下标,即待插入前面的这个数字的下标
while (insertIndex >= 0 && insertValue < arr[insertIndex]){
arr[insertIndex + gap] = arr[insertIndex];
insertIndex -= gap;
}
if(insertIndex + gap != i){
arr[insertIndex + gap] = insertValue;
}
}
}
}
public static void main(String[] args) {
int[] arr = {8,1,2,7,6,5,4,3};
System.out.println("排序前:"+Arrays.toString(arr));
shellSort3(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
算法性能分析
时间复杂度
时间复杂度为O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一个增量值必须是1.另外由于记录跳跃式的移动,希尔排序并不是一种稳定的排序方法。
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。