希尔排序是一种改进的插入排序。前面我们讨论过插入排序在序列的大多数元素都是有序的情况下性能较好。所以希尔排序算法将原始的插入排序算法做了改进,每次比较不是相邻两个元素进行比较,而是隔几个元素之间进行比较,称为步长dk。通过不断缩小dk的值,逐步使得序列中元素有序。当dk缩小到1时,序列中的元素都已经基本有序,再进行插入排序就比较轻松了。

算法步骤:

1.选取合适的步长。可以选取元素个数的一半,也可以选1/3等等。

2.进行步长为dk的插入排序

3.缩小dk,进行递归

void Insort(int *a, int n, int dk)
{int j = 0;for (int i = dk; i < n; ) {j = i;while (a[j] < a[j - dk]){swap(&a[j], &a[j- dk]);j = j - dk;if (j < dk)break;}i = i + dk;}return;
}void ShellSort(int *a, int n) {int dk = n/2;        //    设置初始dkwhile (dk >= 1) {Insort(a, n, dk);dk /= 2;}return;
}

复杂度分析

时间复杂度分析:希尔排序的时间复杂度比较难分析,和序列本身以及步长的选择都有很大的关系,目前还没有个确定的值。查阅了基本数据结构的书籍以及网上的资料,众说纷纭。有两种主流的观点,一种认为是O(nlogn),一种则认为是O(N^3/2),总而言之希尔排序是一种较快的排序算法,速度介于冒泡和快排之间。但因为代码实现较为简单,在数据量较大的情况下也可以使用。

空间复杂度:只有递归消耗的栈空间。所以这个也和选择步长的计算方法有关。上面的例子空间复杂度就是O(logn).

排序算法总结--希尔排序相关推荐

  1. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  2. [算法]-排序算法之希尔排序

    希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...

  3. 排序算法:希尔排序算法实现及分析

    希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...

  4. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

  5. 排序算法之希尔排序(Java实现)

    希尔排序介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序基本思想 ...

  6. 排序算法(4)希尔排序

    排序算法(4)希尔排序 原理: 希尔排序也称缩小增量排序:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序, 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时(用gap ...

  7. php取名字算法,JavaScript排序算法之希尔排序的2个实例_基础知识

    插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位. 希尔排序按其设计者希尔(Donald Shell)的 ...

  8. 经典排序算法之希尔排序

    排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...

  9. 常见排序算法之希尔排序

    文章目录 1.概述 2.希尔排序之交换法 3.希尔排序之移动法 4.测试案例 1.概述 由于简单的插入排序每次数据量变多的时候,数据需要移动且交换数据的次数也会变多,继而影响效率.希尔排序就是在这个基 ...

  10. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

最新文章

  1. android画布,android-视图在画布比例上不适合画布
  2. java 集合 自动排序的_java中的自动排序集合 ---- 20160809
  3. 封装构造函数,用canvas写饼状图和柱状图
  4. 让Windows 7揪出每一个暗中运行程序
  5. lda数学八卦_【技术博客】文本挖掘之LDA主题模型
  6. linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比
  7. java工程师_北京java工程师课程
  8. 拆解日本松下的老古董收录机,感受50年前的电路设计,满满的历史感
  9. 在Flask中上传本地图片到服务器
  10. ARM开发板开机自启
  11. 带登录CSDN刷博客
  12. 可任意切换分频倍数的时钟分频电路
  13. 求两个字符串的最大连续公共字串
  14. 吾爱破解python处理wps文件_太赞了!用Python实现WPS会员功能
  15. Tor 在 linux上使用
  16. JS中事件的绑定和解绑
  17. c语言 mysql 连接字符串,C语言连接MySQL数据库
  18. mysql 更新的进度_如何查看mysql执行进度
  19. Exception: execute cmd error ,cmd : bash start.sh的解决方法
  20. IPv6 地址数量有多少,能够分配到地球上的每一粒尘埃吗

热门文章

  1. 前端发起请求,后端响应请求的整个过程
  2. php星空背景动态,纯CSS3炫酷3D星空动画特效
  3. 解决wordcloud导出图片不清楚
  4. 世纪佳缘推智能设备 是衰退迹象 还是第二春征兆?
  5. 航运大数据——机遇和挑战
  6. 城市地铁站点接驳公交多目标优化方法
  7. Snowflake Decoded基础教程
  8. TensorRT详细入门指南
  9. 关于 NB-IoT NM1 模组 - FAQ
  10. 淘宝账号 支付宝账号 阿里旺旺账号