排序算法:希尔排序算法

文章目录

一、希尔排序(Shell Sort)算法的简介

  希尔排序是对插入排序的一种改进,由 Donald Shell 在 1959 年提出。它的核心思想是:先让元素"跳着走",大致有序后,再用插入排序做精细调整,从而显著减少元素移动次数。

为什么需要希尔排序?

插入排序在以下情况下效率较高:

  • 数据量小
  • 数据"接近有序"

但当数组完全无序、跨度很大 时,插入排序的移动成本很高。

希尔排序的目标:通过"分组 + 插入排序",提前减少逆序对数量

核心思想:将数组按一定"增量 gap"分组,对每一组进行插入排序;逐步缩小 gap,直到 gap = 1。

当 gap = 1 时,等价于一次普通的插入排序,但此时数组已经"基本有序"。

二、希尔排序算法步骤

设数组长度为 n:

  1. 选择一个增量 gap(通常为 n / 2)
  2. 按 gap 对数组进行分组
  3. 对每一组做插入排序
  4. 缩小 gap(通常 gap /= 2)
  5. 重复步骤 2~4,直到 gap == 1

假设数组:

cpp 复制代码
[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]

第 1 轮:gap = 5

分组(索引相差 5)的数据组成一组:

cpp 复制代码
(8,3) (9,5) (1,4) (7,6) (2,0)

各组插入排序后:

cpp 复制代码
[3,5,1,6,0,8,9,4,7,2]

第 2 轮:gap = 2

分组:

cpp 复制代码
(3,1,0,9,7)
(5,6,8,4,2)

排序后:

cpp 复制代码
[0,2,1,4,3,5,7,6,9,8]

第 3 轮:gap = 1(普通插入排序)

最终结果:

cpp 复制代码
[0,1,2,3,4,5,6,7,8,9]

三、时间复杂度分析

希尔排序的时间复杂度 依赖 gap 序列

常见结论(使用 gap = n/2)

相比插入排序的 O(n²),希尔排序明显更快。

五、代码实现

cpp 复制代码
#include <iostream>
using namespace std;

void shellSort(int arr[], int n)
{
    // gap 从 n/2 开始逐步缩小
    for (int gap = n / 2; gap > 0; gap /= 2)
    {
        // 对每一组做插入排序
        for (int i = gap; i < n; i++)
        {
            int temp = arr[i];
            int j = i;

            while (j >= gap && arr[j - gap] > temp)
            {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            arr[j] = temp;
        }
    }
}
相关推荐
渡之4 分钟前
GRiM-Net 深度解析 | 无人机 GNSS 拒止场景下两阶段跨视角视觉定位框架
深度学习·算法·动态规划·无人机
测试仪器廖生1359025638524 分钟前
罗德与施瓦茨 FSP13频谱分析仪FSP30
网络·人工智能·算法
happymaker062626 分钟前
LeetCodeHot100——560.和为K的子数组
算法
dtq042443 分钟前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
郭梧悠1 小时前
Hash算法入门Hash冲突解决方案
算法·哈希算法
洛水水2 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
happymaker06262 小时前
LeetCodeHot100——155.最小栈
算法
洛水水2 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展
Coder-magician2 小时前
《代码随想录》刷题打卡day15:二叉树part05
数据结构·c++·算法
Kurisu_红莉栖2 小时前
力扣56合并区间
算法·leetcode