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

希尔排序

希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序列来改善插入排序的性能,每个子序列的元素间隔为 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)
稳定性不稳定
适用性只可用于顺序表,不可用于链表


http://www.kler.cn/a/597168.html

相关文章:

  • vim的一般操作(分屏操作) 和 Makefile 和 gdb
  • 实验10决策树
  • 【Uniapp】关于核心页面生命周期流程详解
  • 面试题(3)
  • Unity代码中修改动画速度
  • C#里使用libxl的数字格式
  • 1.Go - Hello World
  • NR SRS Configuration
  • 天津大学:《2025深度解读DeepSeek:原理与效应》|44页|附PPT下载方法
  • 基于AWS Endpoint Security(EPS)的自动化安全基线部署
  • 破局 MySQL 死锁:深入理解锁机制与高效解决方案
  • LangChain组件Tools/Toolkits详解(5)——返回产出artifact
  • k8s调度的过程,各组件之间的配合解析
  • Ubuntu实时读取音乐软件的音频流
  • Flutter中常用命令
  • 矩阵篇---矩阵的应用
  • 常考计算机操作系统面试习题(三上)
  • 【Go】map数据类型
  • React 中的错误边界(Error Boundaries),如何使用它们捕获组件错误
  • Java 之「单调栈」:从入门到实战