当前位置: 首页 > news >正文

希尔排序

希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 d(增量)。随着算法的进行,d 逐渐减小,最终减为 1,此时整个序列就被排序好了。

c++代码:

// 希尔排序函数
void shell_sort(std::vector<int>& nums) {
    int temp = 0;
    int n = nums.size();
    // 初始增量为数组长度的一半,逐步缩小增量
    for (int d = n / 2; d >= 1; d /= 2) {
        // 对每个子序列进行插入排序,sub_start表示每个子序列的首元素索引
        for (int sub_start = 0; sub_start < d; sub_start++) {
            // 对当前子序列进行插入排序
            for (int i = sub_start + d; i < n; i += d) {
                if (nums[i] < nums[i - d]) {
                    temp = nums[i];
                    int j;
                    // 移动元素,找到插入位置
                    for (j = i - d; j >= 0 && nums[j] > temp; j -= d) {
                        nums[j + d] = nums[j];
                    }
                    // 插入元素
                    nums[j + d] = temp;
                }
            }
        }
    }
}

c语言代码:

// 希尔排序函数
void shell_sort(int nums[],int n) {
    int temp = 0;
    // 初始增量为数组长度的一半,逐步缩小增量
    for (int d = n / 2; d >= 1; d /= 2) {
        // 对每个子序列进行插入排序,sub_start表示每个子序列的首元素索引
        for (int sub_start = 0; sub_start < d; sub_start++) {
            // 对当前子序列进行插入排序
            for (int i = sub_start + d; i < n; i += d) {
                if (nums[i] < nums[i - d]) {
                    temp = nums[i];
                    int j;
                    // 移动元素,找到插入位置
                    for (j = i - d; j >= 0 && nums[j] > temp; j -= d) {
                        nums[j + d] = nums[j];
                    }
                    // 插入元素
                    nums[j + d] = temp;
                }
            }
        }
    }
}

总结

希尔排序性质
时间复杂度未知,但优于直接插入排序
空间复杂度O(1)
稳定性不稳定
适用性只可用于顺序表,不可用于链表

相关文章:

  • C++脚本化方案调研
  • Axure PR 9.0(发音:Ack-sure)原型图工具入门教程:链接交互
  • 股指期货贴水波动,影响哪些投资策略?
  • 制作Oracle11g Docker 镜像
  • 协程的调度的对称与非对称
  • DeepSeek政务应用场景与解决方案【清华大学最新版】
  • 菜鸟之路Day25一一前端工程化(二)
  • 【数据结构进阶】位图
  • python学习笔记--实现简单的爬虫(一)
  • Ambari、Bigtop源码编译最新支持情况汇总
  • I don‘t know
  • 数据库分页查询详解
  • 嵌入式系统的核心组成部分处理器、存储器、传感器和执行器
  • 练习:倒着输出数字
  • 手机号登录与高并发思考
  • 《洛谷刷题笔记》day11
  • 如何使用AIOps明确Devps的问题归责
  • 【leetcode题解】二分算法
  • Spring6:8 资源操作-Resources
  • 排序算法总结
  • 吴勇强、高颜已任南京市委常委
  • 诺和诺德一季度减重版司美格鲁肽收入增83%,美国市场竞争激烈下调全年业绩预期
  • 外交部:应美方请求举行贸易代表会谈,中方反对美滥施关税立场没有变化
  • 央行:5月8日起,下调个人住房公积金贷款利率0.25个百分点
  • 刘诚宇、杨皓宇进球背后,是申花本土球员带着外援踢的无奈
  • 践行自由贸易主义理念,加快区域合作进程