希尔排序算法

277 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

希尔排序算法

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

算法思路

  • 选定一个增量h(一般是数组长度的一半),按照增量h作为数据分组的依据,对数据进行分组。
  • 对分好组的每一组数据完成插入排序。
  • 减小增量,最小减为1,重复上述第二步。

图解展示

image.png

动图演示

image.png

代码实现

// 对交换式的希尔排序进优化 -> 移位法
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));
    }

1654574163267.png

算法性能分析

image.png

时间复杂度

时间复杂度为O(n^1.5),要好于直接排序的O(n ^ 2),需要注意的是增量序列的最后一个增量值必须是1.另外由于记录跳跃式的移动,希尔排序并不是一种稳定的排序方法。

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。