希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本。希尔排序是不稳定的排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n^2)的排序(冒泡排序或直接插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。
这是第一种写法:

// 希尔排序法
void shell (int* a, int len)
{int gap = len;                      // 代表每一步的步长do {gap = gap / 3 + 1;              // 增量递增int i;// 每一组内部进行插入排序for (i = gap; i < len; i++)     {int get = a[i];             // 保存要插入的数int j = i - gap;// 向前遍历找到比他小的数并插在他后面while (j >= 0 && a[j] > get){a[j+gap] = a[j];j -= gap;}a[j+gap] = get;             // 插入}       }while (gap > 1);
}

这里由于gap=1用while语句会陷入死循环,所以用了do while语句
下面这种写法更为常见:

// 希尔排序法2
void shell2 (int* a, int len)
{int gap = 0;// 生成初始增量while (gap < len){gap = gap * 3 + 1;}   while (gap){int i;// 每一组内部进行插入排序for (i = gap; i < len; i++){int get = a[i];             // 保存要插入的数int j = i - gap;// 向前遍历找到比他小的数并插在他后面while (j >= 0 && a[j] > get){a[j+gap] = a[j];j -= gap;}a[j+gap] = get;             // 插入}gap = (gap - 1) / 3;            // 增量递减}
}

数据结构排序法之希尔排序法(Shell Sort)相关推荐

  1. 数据结构与算法之希尔排序

    数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...

  2. Java数据结构与算法(六) 希尔排序

    ###一.希尔排序的产生 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提 ...

  3. 《大话数据结构》第9章 排序 9.6 希尔排序(下)

    9.6.3 希尔排序算法         好了,为了能够真正弄明白希尔排序的算法,我们还是老办法--模拟计算机在执行算法时的步骤还研究算法到底是如何进行排序的.         希尔排序算法代码如下. ...

  4. 数据结构之插入排序:希尔排序(缩小增量排序)

    排序算法:希尔排序.缩小增量排序 思维导图: 希尔排序的定义: 例: 希尔排序d的选取: 希尔排序的代码实现: 希尔排序的性能: 思维导图: 希尔排序的定义: 普通的插入算法正序时时间复杂度会很小,但 ...

  5. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

  6. 十大经典排序算法之希尔排序及其优化

    一.希尔排序 1.概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进. 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名. 它通过比较相距 ...

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

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

  8. 12. 希尔排序,以及希尔排序的优化

    1. 什么是希尔排序 希尔排序(Shell's Sort)是插入排序的一种又称"缩小增量排序"(Diminishing Increment Sort),是直接插入排序算法的一种更高 ...

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

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

最新文章

  1. C语言解释器的实现--存储结构(一)
  2. 进程间通信-system-v
  3. 美团--最小唯一前缀
  4. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)
  5. C++远征之封装篇——对象数组,对象成员
  6. 笔记:安卓App消息处理机制
  7. varnish使用汇总
  8. 彻底理解PHP的SESSION机制
  9. c235delc杂合变异遗传吗_血常规正常就真的没有地贫吗?
  10. 使用pads查看手机原理图
  11. 数据库mysql局部变量_MySQL内核技术之“pthead局部变量”
  12. C/C++——黑客数字雨特效
  13. IT项目验收流程及说明
  14. SYN cookie
  15. VOS客户端上服务器和软交换状态显示红灯的原因分析
  16. 新年贺卡用python_新年贺卡生成器
  17. 高通骁龙处理器天梯排行榜2022 骁龙处理器发布时间排行
  18. php商城系统有什么优势?php商城系统具备的优势点介绍
  19. 我死了,你还会娶别人吗
  20. 2021年总结以及2022年的计划

热门文章

  1. android显示过程,Android 桌面加载图标过程分析
  2. matlab rootdir,Python cfg.ROOT_DIR属性代码示例
  3. c mysql 编译_MySQL编译安装之cmake
  4. 先序中序数组推后序数组
  5. C++:30 ---C++类成员,成员函数的内存布局
  6. 推荐系统(1)-概述
  7. html 5 笔记,HTML5总笔记(一)
  8. js监听只读文本框_js 动态控制 input 框 的只读属性
  9. java 判断日期为第几天
  10. 同时寻找最大数和最小数的最优算法 第二大数