JavaScript排序算法之希尔排序的2个实例


Posted in Javascript onApril 04, 2014

插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率。
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。
希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布。一些老版本教科书和参考手册把该算法命名为Shell-Metzner,即包含Marlene Metzner Norton的名字,但是根据Metzner本人的说法,“我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。”

JavaScript排序算法之希尔排序的2个实例

希尔排序基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 < d1重复上述的分组和排序,直至所取的增量dt=1(dt < dt-l< … < d2 < d1),即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法。

实例1:

/**
 * 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
 *
 * 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
 *
 * 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
 * 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
 *
 */function shellSort( list ) {
    var gap = Math.floor( list.length / 2 );
    while( gap > 0 ) {
        for( i = gap; i < list.length; i++ ) {
            temp = list[i];
            for( j = i; j >= gap && list[j - gap] > temp; j -= gap ) {
                list[j] = list[j - gap];
            }
            list[j] = temp;
        }
        gap = Math.floor( gap / 2 );
    }
    return list;
};
// test
var arr = [2, 1, 3, 12, 5, 66, 23, 87, 15, 32];
shellSort(arr);

实例2:

<script type="text/javascript">
//document.write("----------希尔排序,插入排序的升级,1959年shell搞出来的------当增量取的正确时,时间复杂度为n的1.3次方-------");
//document.write("<br /><br />")
//var array = new Array(12, 25, 32, 16, 18, 27, 59, 69, 36);
function shellSort(array) {
 var j, i, v, h=1, s=3, k,n = array.length;
 var result = "";
 var count = 0;
    while(h < n)
  h=s*h+1; while(h > 1) {
  h=(h-1)/s;
       for (k=0; k<h; k++)
   for (i=k+h,j=i; i<n; i+=h, j=i) {
            v=array[i];
    while(true)
     if ((j-=h) >= 0 && array[j] > v)
      array[j+h]=array[j];
     else
      break;
    array[j+h]=v;
         }
   count++;
   result += "<br />第" + count + "遍排序的结果是:";
         for (var n = 0; n < array.length; n++) {
            result += array[n] + ",";
          }
 }
 return result;
}
//shallSort(array);
//document.write("<br /><br />");
</script>
Javascript 相关文章推荐
读jQuery之十 事件模块概述
Jun 27 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
通过伪协议解决父页面与iframe页面通信的问题
Apr 05 Javascript
浅谈JavaScript中的对象及Promise对象的实现
Nov 15 Javascript
浅谈Sublime Text 3运行JavaScript控制台
Jun 06 Javascript
jQuery实现获取隐藏div高度的方法示例
Feb 09 Javascript
微信小程序 判断手机号的实现代码
Apr 19 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 Javascript
理解JavaScript中的Proxy 与 Reflection API
Sep 21 Javascript
JavaScript中的prototype.bind()方法介绍
Apr 04 #Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 #Javascript
深入理解javascript的执行顺序
Apr 04 #Javascript
iframe窗口高度自适应的又一个巧妙实现思路
Apr 04 #Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
Apr 04 #Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 #Javascript
javascript中的循环语句for语句深入理解
Apr 04 #Javascript
You might like
PHP中for循环语句的几种变型
2007/03/16 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
php生成静态页面的简单示例
2014/04/17 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
Python实现的Kmeans++算法实例
2014/04/26 Python
Python装饰器知识点补充
2018/05/28 Python
Django框架验证码用法实例分析
2019/05/10 Python
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
三个Unix的命令面试题
2015/04/12 面试题
销售顾问的岗位职责
2013/11/13 职场文书
销售总监岗位职责
2014/01/04 职场文书
考试不及格检讨书
2014/01/09 职场文书
成龙洗发水广告词
2014/03/14 职场文书
道路建设实施方案
2014/03/18 职场文书
二手房购房意向书
2015/05/09 职场文书
成绩单家长意见
2015/06/03 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技