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 相关文章推荐
一个js实现的所谓的滑动门
May 23 Javascript
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
JS模板实现方法
Apr 03 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
Feb 10 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
Angular.JS中的this指向详解
May 17 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 Javascript
最新最全的手机号验证正则表达式
Feb 24 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+jQuery实现自动补全功能源码
2013/05/15 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php将一维数组转换为每3个连续值组成的二维数组
2016/05/06 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
Python实现的概率分布运算操作示例
2017/08/14 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python 实现UTC时间加减的方法
2018/12/31 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
什么是反射?如何实现反射?
2016/07/25 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
高级人员简历的自我评价分享
2013/11/03 职场文书
迟到早退检讨书
2014/02/10 职场文书
副处级干部考察材料
2014/05/17 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
七一党日活动总结
2014/07/08 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android