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 07 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
Javascript的无new构建实例详解
May 15 Javascript
Bootstrap所支持的表单控件实例详解
May 16 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
Jan 06 Javascript
vue单页面在微信下只能分享落地页的解决方案
Apr 15 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 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用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
PHP反向代理类代码
2014/08/15 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python地图绘制实操详解
2019/03/04 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
建筑安全员岗位职责
2014/03/13 职场文书
个人培训自我鉴定
2014/03/28 职场文书
团代会宣传工作方案
2014/05/08 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
如何写新闻稿
2015/07/18 职场文书
重阳节简报
2015/07/20 职场文书
遗嘱格式范本
2015/08/07 职场文书