C++实现希尔排序算法实例

 更新时间:2022年01月07日 17:29:28   作者:恒天1020  
大家好,本篇文章主要讲的是C++实现希尔排序算法实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

1.代码模板

// 希尔排序(Shell Sort)
void ShellSort(SqList *L)
{
    int i, j;
    int increment = L->length;  // 先让增量初始化为序列的长度
    do {
        increment = increment / 3 + 1;   // 计算增量的值
        for (i = increment + 1; i <= L->length; i ++ ) { 
            if (L->arr[i] < L->arr[i - increment]) {   // 如果L->[i]需要插入有序增量子表
                L->arr[0] = L->arr[i];   // 暂存在哨兵位
                for (j = i - increment; j > 0 && L->arr[0] < L->arr[j]; j -= increment) {  // 遍历增量子表,寻找插入位置
                    L->arr[j + increment] = L->arr[j];
                }
                L->arr[j+increment] = L->arr[0];  // 插入
            }
        }
    } while (increment > 1);
}

2.算法介绍

希尔排序,又叫缩小增量排序,算法属于插入类排序的进阶算法,采取跳跃分割的策略,将关键字较小的元素跳跃式的往前挪,大大减小了交换比较的次数。使得序列整体基本有序 ,即大的元素基本在后面,小的元素基本在前面,不大不小的元素基本在中间。

希尔排序的关键在于将序列中相隔某个“增量”的元素组成一个子序列,且序列的最后一个增量必须为1,这样才能保证最后的结果是有序且正确的。但增量如何选择为最佳,至今仍无定论。且由于元素是跳跃式移动的,所有希尔排序是一个不稳定的排序算法,其时间复杂度受到增量选择的影响,最好为O(n^1.3) , 最坏为O(n*n)。

3.实例

#include <iostream>
using namespace std;

const int N = 100;

typedef struct
{
    int arr[N];    // 存储待排序的序列
    int length;    // 存储序列的长度
} SqList;

void ShellSort(SqList *L)
{
    int i, j;
    int increment = L->length;
    do {
        increment = increment / 3 + 1;
        for (i = increment + 1; i <= L->length; i ++ ) {
            if (L->arr[i] < L->arr[i - increment]) {
                L->arr[0] = L->arr[i];
                for (j = i - increment; j > 0 && L->arr[0] < L->arr[j]; j -= increment)
                    L->arr[j + increment] = L->arr[j];
                L->arr[j + increment] = L->arr[0];
            }
        }
    } while (increment > 1);
}

int main()
{
    SqList L;
    L.arr[1] = 50;
    L.arr[2] = 10;
    L.arr[3] = 90;
    L.arr[4] = 30;
    L.arr[5] = 70;
    L.arr[6] = 40;
    L.arr[7] = 80;
    L.arr[8] = 60;
    L.arr[9] = 20;
    L.length = 9;

    ShellSort(&L);
    for (int i = 1; i <= L.length; i ++ )
        cout << L.arr[i] << " ";

}

到此这篇关于C++实现希尔排序算法实例的文章就介绍到这了,更多相关C++希尔排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ 队列相关知识总结

    c++ 队列相关知识总结

    这篇文章主要介绍了c++ 队列相关知识总结,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • C语言基本概念宏定义中的#和##教程

    C语言基本概念宏定义中的#和##教程

    这篇文章主要为大家介绍了C语言基本概念宏定义中的#和##教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • C++在vscode中的多文件编程问题解读

    C++在vscode中的多文件编程问题解读

    这篇文章主要介绍了C++在vscode中的多文件编程问题解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C++ DLL动态库的创建与调用(类库,隐式调用)

    C++ DLL动态库的创建与调用(类库,隐式调用)

    本文主要介绍了C++ DLL动态库的创建与调用(类库,隐式调用),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 基于Windows C++ 应用程序通用日志组件的使用详解

    基于Windows C++ 应用程序通用日志组件的使用详解

    众所周知,在调试、跟踪和执行应用程序的过程中,程序的日志能为这些工作提供大量有价值的运行信息。因此,程序的日志对应用程序的运行、维护至关重要
    2013-05-05
  • C++命名空间使用详细介绍

    C++命名空间使用详细介绍

    考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如它们生活在不同的区域或者兴趣爱好什么的,在C++程序中也会遇到同样的情况,所以命名空间就此产生
    2022-09-09
  • Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    这篇文章主要介绍了解决Visual Studio Code运行程序时输出中文成乱码问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++实现堆排序示例

    C++实现堆排序示例

    这篇文章主要介绍了C++实现堆排序示例,全文运用大量代码完成堆排序,需要了解的朋友可以参考一下这篇文章
    2021-08-08
  • 浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    下面小编就为大家带来一篇浅谈C语言中strcpy,strcmp,strlen,strcat函数原型。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • C++中的vector中erase用法实例代码

    C++中的vector中erase用法实例代码

    在vector数组中我们删除数组经常用的就是erase方法,但是earse的用法一不注意就会出错,今天我就遇到了,所以在这里总结一下,避免大家用错,对vector中erase用法感兴趣的朋友跟随小编一起看看吧
    2022-11-11

最新评论