希尔排序详解及代码讲解

希尔排序是插入排序的一种高效改进版本,也称为"缩小增量排序"。它通过将原始数组分成多个子序列来提高插入排序的效率。

算法思想

希尔排序的基本思想是:

  1. 将数组按照一定的间隔(gap)分成若干子序列

  2. 对每个子序列进行插入排序

  3. 逐渐缩小间隔,重复上述过程

  4. 当间隔为1时,进行最后一次插入排序,此时数组已经基本有序,插入排序效率很高

代码:

复制代码
void ShellSort(int* num, int n)
{
    int gap = n;  // 初始化间隔为数组长度
    while (gap > 1)  // 当间隔大于1时继续排序
    {
        // 计算新的间隔
        gap = gap / 3 + 1;
        
        // 对每个子序列进行插入排序
        for (int i = 0; i < n - gap; i++)
        {
            int end = i;
            int temp = num[end + gap];  // 保存当前待插入元素
            
            // 插入排序过程
            while (end >= 0)
            {
                if (num[end] > temp)  // 如果前一个元素大于待插入元素
                {
                    num[end + gap] = num[end];  // 向后移动元素
                    end -= gap;  // 向前比较
                }
                else
                {
                    break;  // 找到合适位置,退出循环
                }
            }
            num[end + gap] = temp;  // 插入元素到正确位置
        }
    }
}

详细步骤说明

  1. 初始化间隔(gap):

    • 初始间隔设为数组长度n

    • 使用gap = gap / 3 + 1来计算新的间隔,这是一种常见的间隔序列计算方式

  2. 外层循环:

    • 当gap > 1时继续排序

    • 每次循环后gap会缩小,直到最后gap=1

  3. 中间层循环:

    • for (int i = 0; i < n - gap; i++)控制每次处理的起始位置

    • 这个循环实际上是对各个子序列进行交替处理,而不是完整处理一个子序列后再处理下一个

  4. 内层循环(插入排序):

    • 保存当前元素num[end + gap]到temp

    • 将temp与前面间隔gap的元素比较

    • 如果前面的元素更大,则向后移动

    • 直到找到合适的位置插入temp

相关推荐
v_34836087623 小时前
Android native端 堆栈打印
android·算法
residual_fan3 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea3 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询4 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun615 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun615 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan7 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技7 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
302wanger7 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼7 小时前
CF——错题的集合
算法