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 相关文章推荐
JavaScript 继承详解(一)
Jul 13 Javascript
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
jquery click([data],fn)使用方法实例介绍
Jul 08 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
jquery事件preventDefault()方法用法实例
Jan 16 Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 Javascript
jQuery生成假加载动画效果
Dec 01 Javascript
javascript验证香港身份证的格式或真实性
Feb 07 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
node.js中fs文件系统目录操作与文件信息操作
Feb 24 Javascript
React 项目迁移 Webpack Babel7的实现
Sep 12 Javascript
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
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和ACCESS写聊天室(一)
2006/10/09 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php中序列化与反序列化详解
2017/02/13 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
PHP7 新增常量
2021/03/09 PHP
javascript 伪数组实现方法
2010/10/11 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python正则表达式知识汇总
2017/09/22 Python
用python实现的线程池实例代码
2018/01/06 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
使用pandas读取文件的实现
2019/07/31 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
中间件分为哪几类
2016/09/18 面试题
英语道歉信范文
2014/01/09 职场文书
市场营销求职信范文
2014/02/21 职场文书
中考冲刺决心书
2014/03/11 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
感恩教育活动总结
2014/05/05 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python