取一个小于n的整数作为第一个增量,把序列分组。所有距离为增量的倍数的元素放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1,即所有元素放在同一组中进行直接插入排序为止。

一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

以下代码在nodejs中执行通过。

function shellInsertSort(elements, di){//从增量的所在位置开始for(var i = di; i < elements.length; i++){//升序if(elements[i] < elements[i-di]){//取出增量位置的元素作为被插入元素(哨兵)var guard = elements[i];var j = i - di;elements[i] = elements[j];//向前,将增量的倍数的位置作为同一组比较及进行直接插入法while(j >= 0 && guard < elements[j]){elements[j+di] = elements[j];j -= di;}//插入elements[j + di] = guard;}}
}function shellSort(elements){//增量为序列的一半var di = parseInt(elements.length / 2);while(di >= 1){shellInsertSort(elements, di);//每次减半,最后增量必须为1di = parseInt(di / 2);}
}var elements = [10, 9, 8, 7, 6, 5];
console.log('before: ' + elements);
shellSort(elements);
console.log(' after: ' + elements);

效率:比直接插入法快。但不是一种稳定的排序算法,关键取决于增量的选择,初次通常选取序列长度的一半。

(转帖):希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

插入排序---希尔插入排序算法(Javascript版)相关推荐

  1. 连连看连接算法Javascript版

    继连连看连接算法Python版后,我将该算法移植到了Javascript上,为在浏览器版连连看做准备. 功能及使用方法参照另外一篇:连连看连接算法Python版. 值得一提的是由于Javascript ...

  2. 【记录】算法 - JavaScript版

    0.基础 (1)异或 相异为1,相同为0. 性质 N^0=N N^N=0 满足交换律和结合律 (2)与 1&1=1,其他都=0. //利用临时变量实现交换 function swap(arr, ...

  3. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  4. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  5. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  6. java插入排序实现,经典(Java版)排序算法的分析及实现之一直接插入排序

    预备知识 排序算法从功能上是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列.从内存空间使用简单上看分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序,适合不太大的元素序列 ...

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

    /*__________________________________________________________________________________________________ ...

  8. 常用排序算法之插入排序 ( 直接插入排序、希尔排序 )

    插入排序的方法是:从初始有序的子集合开始,不断地把新的数据元素插入到已排列有序子集合的合适位置上,使子集合中数据元素的个数不断增多,当子集合等于集合时,插入排序算法结束.常用的插入排序有直接插入排序和 ...

  9. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

最新文章

  1. linux中vi写java,Linux编辑器vi使用方法详细介绍
  2. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...
  3. 移除List中的元素,你的姿势对了吗?
  4. mysql show table column_mysql show columns 等show的用法
  5. 量子计算机怎样输入数据,量子计算入门
  6. Infor ERP咨询服务市场行业分析报告-行业发展机遇、市场定位及主要驱动因素
  7. Binder基石-Parcel
  8. 人体姿态识别研究综述(详细归纳!)(转载)
  9. iOS Camera照相机
  10. PHP通过CURL爬取飞猪国际机票
  11. python实现第三方验证码获取_python利用第三方模块,发送短信验证码(测试案例)...
  12. 关于Chrome播放视频黑屏解决办法。
  13. TextView里的setText方法
  14. var 、let 和 const 的区别
  15. 【附源码】Python计算机毕业设计时事新闻管理系统
  16. verilog study-初级
  17. sentence Bert解读及代码示例
  18. Python网络爬虫实战之爬取小说
  19. 计算机作品画图板软件四年级,四年级下册信息技术《word画图工具》教学设计...
  20. 教育背景计算机的,素质教育背景下的计算机教育教学原则之我见.doc

热门文章

  1. leetcode339. 嵌套列表权重和
  2. leetcode371. 两整数之和 不用+号做加法
  3. 《Python Cookbook 3rd》笔记(2.17):在字符串中处理html和xml
  4. C++ 力扣剑指Offer16-数值的整数次方
  5. 经理人如何与这“六种人”打交道?
  6. 腾讯CKV海量分布式存储系统
  7. 你是否发现 职业能力危机,请 警惕
  8. 编译器vs.代码 谁之过
  9. 揭秘IT人才特点:中美印日四国程序员比较
  10. 多线程编程指南 part 2