首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【算法 之希尔排序 原理及案例】

【算法 之希尔排序 原理及案例】

作者头像
flos chen
发布2026-01-23 18:33:36
发布2026-01-23 18:33:36
1240
举报

希尔排序(Shell Sort)

希尔排序(Shell Sort)是插入排序的一种优化版本,也称为缩小增量排序。它的基本思想是:先将整个待排序的记录序列分割成为若干子序列(由相隔某个“增量”的记录组成)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

希尔排序的增量序列可以有多种选择,其中Hibbard增量序列Δk=2k−1−1是较常使用的一种,但这不是唯一的。这里我们简单介绍使用Hibbard增量序列的希尔排序。

以下是希尔排序的C++代码示例:

不利于理解的地方:i从gap开始,单纯就是为了前面几次插入排序,少算进来几个元素。 按理来说应该是0, gap, 2 * gap; 1, 1 + gap, 1 + 2*gap。

代码语言:javascript
复制
#include <iostream>  
#include <vector>  
  
void shellSort(std::vector<int>& arr) {  
    int n = arr.size();  
    int gap = n / 2; // 初始增量  
  
    // 增量逐渐减小  
    while (gap > 0) {  
        // 对每个子序列进行插入排序  
        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;  
        }  
        gap /= 2; // 减小增量  
    }  
}  
  
int main() {  
    std::vector<int> arr = {9, 8, 3, 7, 5, 6, 4, 1};  
    std::cout << "Original array: ";  
    for (int num : arr) {  
        std::cout << num << " ";  
    }  
    std::cout << std::endl;  
  
    shellSort(arr);  
  
    std::cout << "Sorted array: ";  
    for (int num : arr) {  
        std::cout << num << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

在这个示例中,shellSort 函数接收一个整数向量 arr 作为参数,并使用希尔排序算法对其进行排序。在 main 函数中,我们创建了一个待排序的向量,并调用 shellSort 函数进行排序。然后,我们打印出排序前后的向量以验证排序结果。

希尔排序的时间复杂度与增量序列的选取有关,这里给出的只是其中一种实现方式。在实际应用中,希尔排序的性能通常优于直接插入排序,但是不如快速排序、归并排序等更高效的排序算法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 希尔排序(Shell Sort)
  • 以下是希尔排序的C++代码示例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档