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的表头固定的若干方法
Jan 27 Javascript
Jquery显示、隐藏元素以及添加删除样式
Aug 09 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
jquery常用方法及使用示例汇总
Nov 08 Javascript
JavaScript实现打字效果的方法
Jul 10 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
Apr 26 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
Jan 23 Javascript
理解javascript async的用法
Aug 22 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
JavaScript 禁止用户保存图片的实现代码
Apr 28 Javascript
详解element-ui动态限定的日期范围选择器代码片段
Jul 03 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
python读取word文档的方法
2015/05/09 Python
python保存字符串到文件的方法
2015/07/01 Python
python文件与目录操作实例详解
2016/02/22 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
python实现ip地址的包含关系判断
2020/02/07 Python
python操作toml文件的示例代码
2020/11/27 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
c/c++某大公司的两道笔试题
2014/02/02 面试题
函授本科毕业自我鉴定
2013/10/09 职场文书
医学生求职自荐信
2013/10/25 职场文书
自我鉴定注意事项
2014/01/19 职场文书
信息技术教学反思
2014/02/12 职场文书
学校党员对照检查材料
2014/08/28 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
费城故事观后感
2015/06/10 职场文书
python基础之文件操作
2021/10/24 Python