希尔排序详解

希尔排序是插入排序的一种更高效的改进版本,也称为"缩小增量排序"


前言

希尔排序的核心思想是:使数组中任意间隔为 gap 的元素都是有序的。这样的数组被称为是 gap 有序 的,基本思路:先将整个待排序的序列分割成若干个子序列,分别进行直接插入排序。待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序,如何分割? 通过一个增量序列(Gap Sequence) 来控制。增量逐渐减小,最终减至 1(即对整个数组进行最后一次标准的插入排序)

**我们以数组 [8, 9, 1, 7, 2, 3, 5, 4, 6, 0] 为例,详细演示希尔排序的每一步过程,**数组长度 n = 10,使用希尔增量序列:gap = 5 → 2 → 1

排序后数组: [3, 5, 1, 6, 0, 8, 9, 4, 7, 2]

第2轮:gap = 2

排序后数组: [0, 2, 1, 4, 3, 5, 7, 6, 9, 8]

第3轮:gap = 1

对整个数组进行标准插入排序:数组:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]

最终排序结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

实现希尔排序

cpp 复制代码
void shellSort(int arr[], int n) {
   int gap=n/2;
     while (gap > 0) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j = i - gap;  // 从前一个位置开始
            
            while (j >= 0 && arr[j] > temp) {
                arr[j + gap] = arr[j];  // 向后移动
                j -= gap;
            }
            arr[j + gap] = temp;  // 插入到正确位置
        }
        gap /= 2;
    }
}
cpp 复制代码
初始数组: 8 9 1 7 2 3 5 4 6 0 
=== 第1轮排序,gap = 5 ===
处理元素 arr[5] = 3: 8 9 1 7 2 [3] 5 4 6 0 
  移动 arr[0](8) -> arr[5]
  插入 3 到位置 0
  当前数组: 3 9 1 7 2 8 5 4 6 0 
处理元素 arr[6] = 5: 3 9 1 7 2 8 [5] 4 6 0 
  移动 arr[1](9) -> arr[6]
  插入 5 到位置 1
  当前数组: 3 5 1 7 2 8 9 4 6 0 
处理元素 arr[7] = 4: 3 5 1 7 2 8 9 [4] 6 0 
  移动 arr[2](1) -> arr[7]
  插入 4 到位置 2
  当前数组: 3 5 4 7 2 8 9 1 6 0 
处理元素 arr[8] = 6: 3 5 4 7 2 8 9 1 [6] 0 
  移动 arr[3](7) -> arr[8]
  插入 6 到位置 3
  当前数组: 3 5 4 6 2 8 9 1 7 0 
处理元素 arr[9] = 0: 3 5 4 6 2 8 9 1 7 [0] 
  移动 arr[4](2) -> arr[9]
  插入 0 到位置 4
  当前数组: 3 5 4 6 0 8 9 1 7 2 
本轮排序后: 3 5 4 6 0 8 9 1 7 2 

=== 第2轮排序,gap = 2 ===

=== 第3轮排序,gap = 1 ===

最终排序结果: 0 1 2 3 4 5 6 7 8 9 

总结

希尔排序通过将大规模数组先调整为"基本有序"的状态,极大地减少了最后一次插入排序的比较和移动次数,从而提升了整体性能。它是一种非常巧妙的算法,虽然在实际应用中已被更高效的算法所取代,但其思想仍然非常值得学习和借鉴。它很好地展示了如何通过预处理来优化一个简单算法

相关推荐
智者知已应修善业3 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied3 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0113 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
历程里程碑4 小时前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode
量子炒饭大师4 小时前
Cyber骇客的逻辑节点美学 ——【初阶数据结构与算法】二叉树
c语言·数据结构·c++·链表·排序算法
課代表4 小时前
从初等数学到高等数学
算法·微积分·函数·极限·导数·积分·方程
ullio4 小时前
arc206d - LIS ∩ LDS
算法
等等小何4 小时前
leetcode1593拆分字符串使唯一子字符串数目最大
算法
量子炒饭大师5 小时前
Cyber骇客神经塔尖协议 ——【初阶数据结构与算法】堆
c语言·数据结构·c++·二叉树·github·
XLYcmy5 小时前
TarGuessIRefined密码生成器详细分析
开发语言·数据结构·python·网络安全·数据安全·源代码·口令安全