【数据结构与算法】希尔排序

【数据结构与算法】希尔排序

👨‍💻 关于作者:会编程的土豆

“不是因为看见希望才坚持,而是坚持了才看见希望。”

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚 正在更新中的专栏:

💕作者简介:后端学习者

概念

希尔排序 = 插入排序 + 分组跳跃

它不是一次只和前面相邻的元素比,而是先隔着很远比,然后慢慢缩小距离,最后变成普通的插入排序

为什么需要希尔排序?

简单插入排序有个明显的软肋:当较小的数都堆在数组尾部时,排序效率会很低。因为插入排序每次只能交换相邻元素,要把尾部的小数挪到前面,需要一步一步“冒泡”过去,非常耗时。

看一下插入排序的代码:

public static void insertionSort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) { int j = i; int temp = arr[j]; while (j > 0 && arr[j - 1] > temp) { //如果前一个元素比当前元素大,则将前一个元素向后移动一位。 //将 j 的值减1,继续比较前一个元素。 arr[j] = arr[j - 1]; j--; } arr[j] = temp; } } 

而希尔排序通过引入增量(Gap)的概念,允许元素跳跃式移动,让小数能更快地“蹦”到前面,从而解决了这一问题

希尔排序代码

void shellSort(vector<int>& arr) { int n = arr.size(); // 外层循环:控制 gap 从 n/2 开始,每次减半 for (int gap = n / 2; gap > 0; gap /= 2) { // 内层循环:对每个分组做插入排序 // 注意这里从 gap 开始,而不是从 1 开始 for (int i = gap; i < n; ++i) { int key = arr[i]; int j = i - gap; // 和前面相隔 gap 的元素比较 while (j >= 0 && arr[j] > key) { arr[j + gap] = arr[j]; // 大的往后挪 gap 个位置 j -= gap; // 往前跳 gap 个位置继续比 } arr[j + gap] = key; // 插入到正确位置 } } }

插入排序 vs 希尔排序 代码对比

插入排序希尔排序
for (int i = 1; i < n; ++i)for (int gap = n/2; gap > 0; gap/=2)
for (int i = gap; i < n; ++i)
int j = i - 1;int j = i - gap;
while (j >= 0 && arr[j] > key)while (j >= 0 && arr[j] > key)
arr[j + 1] = arr[j];arr[j + gap] = arr[j];
j -= 1;j -= gap;
arr[j + 1] = key;arr[j + gap] = key;

唯一的区别:把插入排序里的 1 全部换成了 gap,再套一层 gap 递减的循环。

复杂度与特点

特性说明
时间复杂度取决于 gap 序列,经典希尔增量 O(n²),优化序列可达 O(n^1.3)
空间复杂度O(1),原地排序
稳定性不稳定(跳跃式交换可能打乱相同元素的顺序)
适用场景中等规模数据,嵌入式设备等内存敏感场景

一句话总结

希尔排序 = 带间隔的插入排序,通过"大步跳跃 + 逐步逼近"来优化小数后移的问题。

希尔排序的核心原理

核心概念:增量(Gap)

希尔排序引入了一个间隔 gap,它不是让元素和相邻的比,而是和相隔 gap 个位置的元素比。

过程分三步:

  1. 分组:按 gap 把数组分成若干组
  2. 组内插入排序:对每组分别做插入排序
  3. 缩小 gap:gap 减半,重复上述过程,直到 gap = 1

当 gap = 1 时,就是普通的插入排序,但此时数组已经基本有序,插入排序会非常快。

图解演示

数组:[80, 93, 60, 12, 42, 30, 68, 85, 10]

第一轮:gap = 4

把相隔 4 个位置的元素分为一组:

下标: 0 1 2 3 4 5 6 7 8 值: 80 93 60 12 42 30 68 85 10 分组情况(相同标记的为一组): 组1 (▲): 80, 42, 10 → 下标 0, 4, 8 组2 (●): 93, 30 → 下标 1, 5 组3 (■): 60, 68 → 下标 2, 6 组4 (◆): 12, 85 → 下标 3, 7

对每组分别做插入排序:

  • 组1 排序后:10, 42, 80
  • 组2 排序后:30, 93
  • 组3 排序后:60, 68
  • 组4 排序后:12, 85

放回原数组:

排序前: [80, 93, 60, 12, 42, 30, 68, 85, 10] 排序后: [10, 30, 60, 12, 42, 93, 68, 85, 80]

观察:最小的 10 从最后一位(下标 8)跳到了第一位(下标 0)!一步跨了 8 个位置,这就是希尔排序的效率来源。


第二轮:gap = 2

当前: [10, 30, 60, 12, 42, 93, 68, 85, 80] 分组: 组1 (▲): 10, 60, 42, 68, 80 → 下标 0,2,4,6,8 组2 (●): 30, 12, 93, 85 → 下标 1,3,5,7

分别插入排序后放回:

排序前: [10, 30, 60, 12, 42, 93, 68, 85, 80] 排序后: [10, 12, 42, 30, 60, 85, 68, 93, 80]

第三轮:gap = 1

就是普通的插入排序:

排序前: [10, 12, 42, 30, 60, 85, 68, 93, 80] 排序后: [10, 12, 30, 42, 60, 68, 80, 85, 93]

此时数组已经基本有序,插入排序只需要很少的移动就能完成。

注意排序时:

每一组元素只在属于自己组的下标位置之间进行排序和交换,完全不碰其他组的元素

说人话就是:比如说这一组数,就是在原来数组的这一组的基础之上排序换位置,而其他组的位置丝毫不影响,只在自己的那个gap组里面换;

Read more

从零构建智能技能(Skill):AI时代业务开发的实战手册

从零构建智能技能(Skill):AI时代业务开发的实战手册

在大模型与智能体(Agent)技术快速普及的今天,“Skill”(技能)正成为连接业务需求与AI能力的核心单元。不同于传统API或微服务,一个Skill不仅封装了执行逻辑,还融合了语义理解、工具调用、上下文推理与结果生成等智能行为。本文将手把手带你从0到1完整打造一个可工程化、可复用、可编排的AI Skill,适用于客户服务、运营自动化、内部提效等真实业务场景。 一、什么是Skill?为什么需要它? Skill = 智能 + 行动 + 上下文 * 智能:能理解自然语言指令(如“帮我查一下上周订单的退款状态”); * 行动:能调用外部工具(数据库、API、RPA等)完成任务; * 上下文:能结合用户身份、历史对话、业务规则做出合理决策。 ✅ 举例: “查询用户积分”不是一个简单的接口调用,而是一个Skill——它需识别用户ID、验证权限、调用积分系统、格式化回复,并在余额不足时主动建议兑换活动。 二、Step-by-Step:

阿里重磅上线了 QoderWork,一个真正能干活的 AI Agent

春节假期在家里闲的没事,我打开 Qoder 官网突然发现阿里竟然上线了一款桌面级通用智能体助手 QoderWork,看名字我们就知道它是做什么的了,就是为普通人打造的一款 AI Agent,目的是将 Qoder 的 Agent 能力从代码领域扩展到日常工作场景,描述需求,自动执行,直接交付结果。 不像是 Qoder AI 编程 IDE 或者  Qoder CLI 终端 Agent ,上手有门槛,更像是跟专业程序员使用的。QoderWork 是可视化的 UI 界面,桌面应用,上手超级简单,几乎没有门槛。 不止聊天,搞定一切 这是 QoderWork 最核心的理念。QoderWork 的定位是「本地运行、自主规划、安全可控的 AI 工作搭子」。 注意这几个关键词:本地运行,

Stitch——Google热门的免费AI UI设计工具

Stitch——Google热门的免费AI UI设计工具

Google Stitch是谷歌在2025年I/O大会上推出的一款AI驱动的UI设计工具。它能根据文字描述或草图快速生成网页和移动端界面,并导出可用于开发的前端代码,并且可以直接与另一个前端AI编码工具AI Studio直接联动,将生成的UI发给AI Studio进行开发。 访问方式与要求: 1. 通过访问官网(stitch.withgoogle.com),使用谷歌账户登录即可开始使用。 2. Google Stitch并不支持全部地区,如vpn设置为中国香港也无法访问,美国地区可以使用。 使用流程: 第一步:进入官网并完成登录: 第二步:选择合适的模型: 1. 默认选择的是3 Flash,使用Gemini 3.0 Flash,生成速度较快。 2. 3 Pro模式下,优先保障高质量与推理能力,速度缓与3 Flash。 3. Redesign模式使用Nano Banana Pro重新设计现有项目,需要添加屏幕截图。 4. Ideate模式下,支持提出问题并寻找解决方案。 第三步:选择移动端或Web端并添加描述:

QClaw 上手指南:我用了一周龙虾,感觉自己白用了两年 AI

QClaw 上手指南:我用了一周龙虾,感觉自己白用了两年 AI

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 QClaw 上手指南:我用了一周龙虾,感觉自己白用了两年 AI * 先说清楚:OpenClaw 是什么,龙虾又是怎么来的 * 第一次打开:它先问你是谁 * 微信直联:手机变成了 AI 的遥控器 * 接入自定义模型:你的 API 你做主 * Skills 插件:能力边界一直在扩 * 角色系统:不是换个语气,是换个工作模式 * 定时任务:让 AI 主动替你干活 * 它是怎么「记住你」的 * 本地跑意味着什么 * 适合什么人用 * 最后 如果你最近在关注 AI 工具圈,大概率听说过一个叫 OpenClaw 的东西,中文社区管它叫「龙虾」。这个开源项目在