算法-希尔排序

希尔排序 (Shell Sort)

像"分组接力赛"一样,一开始步长(gap)很大,把相隔很远的元素分到一组进行插入排序,让数据能快速跨越到接近最终位置的地方(预排序);然后不断缩小步长,让数组越来越接近整体有序;最后当步长为 1 时,整个数组只需进行一次普通的插入排序就能轻松搞定。

核心代码

c 复制代码
#include <stdio.h>

// 希尔排序函数
void shellSort(int arr[], int n) {
    // 初始步长设为数组长度的一半,每次缩小为原来的一半,直到为1
    for (int gap = n / 2; gap > 0; gap /= 2) {
        // 从第 gap 个元素开始,对每个子序列进行插入排序
        for (int i = gap; i < n; i++) {
            int temp = arr[i]; // 暂存当前需要插入的元素
            int j = i;
            
            // 在当前子序列中,将比 temp 大的元素向后移动 gap 个位置
            // j - gap >= 0 保证不越界
            while (j - gap >= 0 && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            // 找到正确位置后,将 temp 插入
            arr[j] = temp;
        }
    }
}

// 打印数组的辅助函数
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {64, 34, 25, 12, 22};
    int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
    
    printf("排序前:");
    printArray(arr, n);
    
    shellSort(arr, n); // 调用希尔排序
    
    printf("排序后:");
    printArray(arr, n);
    return 0;
}

示例演示

{64, 34, 25, 12, 22}

第 1 趟:步长 gap = 2 (5/2)

目标:将相隔 2 个位置的元素分为一组进行预排序。

分组情况:

组1(下标 0, 2, 4):{64, 25, 22}

组2(下标 1, 3):{34, 12}

对组1进行插入排序:22 < 25 < 64,排序后组1变为 {22, 25, 64}。

对组2进行插入排序:12 < 34,排序后组2变为 {12, 34}。

第 1 趟结束:数组变为 22, 12, 25, 34, 64,数据整体更有序了。
第 2 趟:步长 gap = 1 (2/2)

目标:步长缩小为 1,相当于对整个数组进行一次普通的插入排序。

处理元素 12(下标 1):12 < 22,22 往后挪,12 插入到最前面。数组变为:12, 22, 25, 34, 64

处理元素 25(下标 2):25 > 22,无需挪动。

处理元素 34(下标 3):34 > 25,无需挪动。

处理元素 64(下标 4):64 > 34,无需挪动。

第 2 趟结束:排序完成。

最终结果:12, 22, 25, 34, 64

复杂度

时间复杂度是\(O(n^{1.3})\)(平均情况,具体取决于步长序列的选取;最坏情况为 \(O(n^2)\))

空间复杂度是 \(O(1)\)(原地排序,仅需常数级的额外空间用于暂存元素)

相关推荐
forest_097 小时前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi
纪念 2298 小时前
C++ 算法基础 (差分)
开发语言·c++·算法
jyOverQ11 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
严肃小白兔13 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽13 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
【心态好不摆烂】14 小时前
数据结构基础精讲3
数据结构·算法
岑梓铭14 小时前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408
漂流瓶jz15 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
Pniubi16 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划