一.原理

  • 希尔排序是对直接插入排序的改进,建立在直接排序的基础上实现的。因为直接插入排序适合那些数据本身就是基本有序的或者数据量比较小的情况。但是,实际中数据量小或数据基本有序属于特殊情况,这就是直接插入排序的局限性。希尔排序的基本思想就是当有大量的数据需要排序时,可以将大量的数据分组成若干子序列,此时每个子序列的数据比较少,可以对每个子序列使用直接插入排序。当整个序列基本有序时(基本有序:小的关键字基本在前,大的基本在后,不大不小的基本在中间)。再对整体的数据进行一次直接插入排序。对原始数据进行分割的目的就是减少待排序数据的个数,使得整个序列朝着基本有序方向发展。采用的分割策略是:将相距某个增量increment的数据组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序的。

二.希尔排序过程

三.希尔排序完整代码

```#include "iostream"using namespace std;#define N 9#define MAXSIZE 10#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status;typedef struct{int r[MAXSIZE+1];int len;}Sqlist;void show(Sqlist L){for(int i = 1; i <= L.len; i++)cout << L.r[i] << " ";cout << endl;}// 希尔排序void ShellSort(Sqlist *L){int i, j;int increment = L->len;  // 增量的初始化do{ // 每执行一次do-while循环就会生成一个子序列,每个子序列的生成使用的增量increment是不同的!但是序列将原来越来越朝着基本有序的方向发展increment = increment / 3 +1;for(i = increment+1; i <= L->len; i++){if(L->r[i] < L->r[i-increment]){  // 插入的元素是L->r[i],进行比较L->r[0] = L->r[i];   // 将需要的插入的元素暂时存储在哨兵中for(j = i-increment; j>0 && L->r[j] > L->r[0];j-=increment)L->r[j+increment] = L->r[j];   // 进行交换操作L->r[j+increment] = L->r[0];}  }}while(increment > 1);  // 跳跃式的移动,而直接排序中是使用increment=1固定的!}int main(){Sqlist L;int d[N] = {9, 1, 5, 8, 3, 7, 4, 6, 2};for(int i = 0; i < N; i++)L.r[i+1] = d[i];L.len = N;cout << "希尔排序前: ";show(L);cout << "希尔排序后: ";ShellSort(&L);show(L);return 0;}
```
  • STL实现
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;//  希尔排序:每一轮按照事先决定的间隔进行插入排序,间隔会依次缩小,最后一次一定要是1。// 打印元素
void PrintV(vector<int>& v){for(auto &e: v){cout << e << ' ';}cout << endl;
}// 希尔排序
void ShellSort(vector<int>& v){int n = v.size();int h = 1;   // 间隔while(h < n / 3){h = 3 * h + 1;}while(h >= 1){for(int i=h; i < n; ++i){for(int j=i; j >= h && v[j] < v[j-h]; j-=h){swap(v[j], v[j-h]);}}h = h / 3;}
}int main(){vector<int> v{7, 30, 16, 4, 1, 2, 9};cout << "希尔排序前: ";PrintV(v);ShellSort(v);cout << "希尔排序后: ";PrintV(v);return 0;
}

四、希尔排序时间复杂度总结:

  • 平均时间复杂度: O(nlogn)——O(n**2)
  • 最好情况:O(n**1.3)
  • 最坏情况:O(n**2)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

希尔排序算法实现思想个人理解相关推荐

  1. 选择排序算法实现思想个人理解

    一.选择排序算法个人理解 如果有N个元素需要排序,首先从N个元素中找到最小的那个元素,然后与索引ix=0位置上的元素进行交换(如果没有比原来索引ix=0位置上的元素小就不用交换),接着再从剩下的N-1 ...

  2. 209-希尔排序算法的思想和性能分析

    1.希尔排序算法的思想和性能分析 希尔排序可以认为是插入排序的一个优化,升级. 如果数据序列从大的方向,从全局看,已经是趋于有序的,那么插入排序是所有排序算法中效率最高的. 希尔排序就是从插入排序的这 ...

  3. 希尔排序算法思想及代码

    希尔排序 一.希尔排序算法思想 二.代码 一.希尔排序算法思想 希尔排序是特殊的插入排序,直接插入排序每次插入前的遍历步长为1,而希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行直接插入排序 ...

  4. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  5. 【算法知识】详解希尔排序算法

    前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动 ...

  6. 【数据结构----笔记5】插入排序算法之【希尔排序算法】

    /*__________________________________________________________________________________________________ ...

  7. Go 实现希尔排序算法及图解

    耐心和持久胜过激烈和狂热. 哈喽大家好,我是陈明勇,今天分享的内容是使用 Go 实现希尔排序算法.如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有 ...

  8. 希尔排序 最坏时间_希尔排序算法

    希尔排序(Shell's Sort)是插入排序的一种,又称"缩小增量排序",是直接插入排序算法经过改进之后的一种更高效的版本.希尔排序为了加快速度简单地改进了插入排序,交换不相邻的 ...

  9. SWUST OJ#1099(希尔排序算法实现)

    目录 题目 代码 小结 题目 代码 #include <iostream> #include <algorithm> using namespace std; int main ...

最新文章

  1. linux下git的简单使用
  2. Maven找不到要运行的JUnit测试
  3. P4161 [SCOI2009]游戏
  4. GARFIELD@09-21-2004
  5. Windows10 家庭版——开启Hyper-V虚拟机
  6. Kendo UI Professional Q3 2015 Beta发布[附下载]
  7. 通过Spring Integration消费Twitter Streaming API
  8. anychart说明文档
  9. gentry同态加密算法_基于Gentry全同态加密算法公钥个数优化的研究
  10. printf 输出字符串 需要加上 c_str()
  11. 统计每天的数据 无数据也要显示日期程序解决方法
  12. Crackme017
  13. 不固定个数的子元素自适应居中
  14. 考研计算机网络必考考点,计算机专业考研计算机网络考点汇总
  15. 红帽linux安装中文输入法,Redhat安装中文输入法
  16. 万元大奖和Switch等你来拿,百度飞桨AI创造营带你出道
  17. win7安不了python_win7下安装python失败问题
  18. CAD等高线转地形高程散点
  19. 爬取拉钩网60条招聘信息并存入数据库
  20. vue项目echarts通过cdn或npm引入

热门文章

  1. 消息中间件系列第2讲:如何进行消息队列选型?
  2. python 内置方法
  3. postman简单教程,如何在请求中引用上次请求返回的值
  4. 2017 多校3 hdu 6061 RXD and functions
  5. 启用无密码方式登录ssh
  6. Covariance and Contravariance in C#的搜索条件
  7. Android Opengl
  8. 有关YARN/MRv2 相关
  9. 避免35岁现象,我给技术人的建议永远是架构师!
  10. 8个步骤成功拖垮新业务线!