参考书:
严蔚敏-数据结构

希尔排序(Shell's Sort)

希尔排序又称"缩小增量排序",归属于插入排序一类,简单来说,和我们的插入排序比,它更快.

奇妙的记忆点:

  • 内排序(内存排序就够了)

  • 不稳定(排序后原始顺序无法保证)

希尔排序重点在于分割.

基本思想:

将整个待排序记录序列分割为若干个子序列,然后对每一个子序列进行直接插入排序.

直接插入排序:

不得不先讲一下直接插入排序了,毕竟希尔排序要使用到直接插入排序.
直接插入算法重点在于分区,有序区与无序区.假设我们有一个数组arr

for(var i = 1;i<arr.length;i++){var key = arr[i];var j = i;while(j>0&&arr[j-1]>key){arr[j] = arr[j-1];j--;}arr[j]=key;
}

其中i=1,i~arr.len-1为我们的无序区,而i=0为我们的有序区.temp用于记录无序区准备进入有序区的元素,j用于从右往左遍历有序区并将元素往后推,找出相应的插入位置,将temp插入对应位置.

希尔排序:代码

希尔排序关键在于增量的设置,根据增量分割数组并逐步进行直接插入排序,增量逐趟减少,并最后使得整个数组基本有序,再对整体进行直接插入排序.

记忆点

  • best condition: T(n) = O(n*log2 n)

  • baddest condition: T(n) = O(n*log2 n)

  • average condition: T(n) = O(n*log n)

基本的思路就是根据增量分割数组,如var arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
我们增量为5,则分割为
[3,15,46]
[44,36,4]
[38,26,19]
[5,27,50]
[47,2,48]
并对每一组进行直接插入排序
再把增量变为2(减半),再进行分割,直到增量为1,再对全体进行一次直接插入排序就可以了.
简略的代码如下:

    var len =arr.length;gap = Math.floor(len/2);while(gap!==0){for(var i = gap;i<len;i++){var temp = arr[i];var j;for(j=i-gap;j>=0&&temp<arr[j];j-=gap){arr[j+gap] = arr[j];}arr[j+gap] = temp;}gap=Math.floor(gap/2);}return arr;

简单说一下,i从gap位开始,那么每组的有序区已经确定了一位,接下来将i-gap位的数根据组的不同插入有序区,就完成了每组的直接插入排序了.

相关流程图

动态定义间隔序列

这是我在掘金看来的

希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的。

while(gap < len/5) { //动态定义间隔序列 gap =gap*5+1;
}

参考来源:http://gold.xitu.io/post/57dc...
详细介绍了十种算法,大家可以去学习下.

以后大概会尽量每天更新一个算法学习吧,温故而知新

基本算法学习(一)之希尔排序(JS)相关推荐

  1. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  2. 希尔排序的详细过程_算法系列: 10大常见排序算法(4)希尔排序

    本课程是从少年编程网转载的课程,目标是向中学生详细介绍计算机比赛涉及的编程语言,数据结构和算法.编程学习最好使用计算机,请登陆 www.3dian14.org (免费注册,免费学习). 一句 希尔排序 ...

  3. 算法学习(八)——排序算法汇总

    文章目录 注:完整代码请参见我的Github 前言 一.排序的分类 二.算法学习 1.冒泡排序(bubble sort) 冒泡排序代码 2.简单选择排序 简单选择排序代码 3.直接插入排序 直接插入排 ...

  4. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  5. 希尔排序的java算法_Java算法系列篇 【希尔排序】

    什么? 搞Java不会算法? 由于个人兴趣原因以及工作所需,最近了解Java算法的相关案例 及时分享 感兴趣的欢迎交流 希尔排序 描述: 基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直 ...

  6. 算法与数据结构(希尔排序)

    希尔排序 Shell's Sort 我们都知道直接插入排序对有序度高的列表排序效率是比较高的.而当列表为倒序时,最后一位元素的值是最小的,直接插入排序会进行 n-1 次比较才能找到正确的位置.这种情况 ...

  7. (数据结构与算法)插入排序和希尔排序

    1. 插入排序 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序 ...

  8. 数据结构与算法 | 直接插入排序、希尔排序

    前几章讲了选择排序中的直直接选择排序.双向选择排序.堆排序,这次来讲讲利用'插入'为核心来实现的插入排序算法. 插入排序 把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所 ...

  9. shell排序_Python排序算法(五)希尔排序

    一. 核心思想 希尔排序(shell_Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本.基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录& ...

最新文章

  1. 作业12图的着色问题
  2. php安装gb,php安装程序的原理
  3. 阵列卡缓存电池充放电问题详解
  4. 关于owa over https的邮箱加密访问
  5. 实现定时中断_无线传感器网络实验报告(二)Timer定时应用实验
  6. python循环一段代码_Python循环语句代码详解:while、for、break
  7. Python学习-初始列表
  8. linux进程阻塞例子,一个Linux守候进程例子
  9. java数组转为字符串_join()和toString()方法 将数组转换为字符串
  10. a4如何打印双面小册子_小册子打印
  11. 使用ClassLoader加载资源详解
  12. 移远EC20开发环境搭建
  13. SGMII和RGMII入门学习
  14. 使用Android studio 制作完app运行安装没问题,但是打开显示。。。keeps stopping
  15. 语音动画设置 android,Anroid Studio第七期 - 语音动画
  16. 博士入坑必读-A-Z博士(PhD)顺利毕业必读指南
  17. Suit and Tie (在线swap 贪心 思维)
  18. 公链分析报告(2)--EOS
  19. 个人主页【阿飞算法】
  20. 果壳网(guokr.com)发布了

热门文章

  1. 2013年蓝桥杯省赛C/C++A组真题解析
  2. Ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
  3. 调查:中国CIO在亚太拥最大战略影响力
  4. 在vue-cli创建的项目里配置scss
  5. [剑指offer] 用两个栈实现队列
  6. 关于SQLServer和MySQL动态条数限制
  7. 【iCore3 双核心板_FPGA】实验二十七:基于SDRAM的TFT驱动器的设计
  8. [COCI 2013/2014 ROUND 3] parovi
  9. js_Event Loop(笔记)
  10. YESLAB的数据中心课程介绍