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模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
jQuery Tools Dateinput使用介绍
Jul 14 Javascript
jquery实现动态画圆
Dec 04 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
Mar 10 Javascript
js实现鼠标经过表格行变色的方法
May 12 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
jQuery实现弹幕效果
Feb 17 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
Vue路由之JWT身份认证的实现方法
Aug 26 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
Vue router配置与使用分析讲解
Dec 24 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变量范围介绍
2012/10/15 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python实现移位加密和解密
2019/03/22 Python
Python单元和文档测试实例详解
2019/04/11 Python
Python初学者常见错误详解
2019/07/02 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
《藏戏》教学反思
2014/02/11 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
春节联欢会策划方案
2014/05/16 职场文书
高中同学会活动方案
2014/08/14 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
五好家庭事迹材料
2014/12/20 职场文书
感谢信怎么写
2015/01/21 职场文书
离婚律师函范本
2015/05/27 职场文书
初中语文教学研修日志
2015/11/13 职场文书
Java 写一个简单的图书管理系统
2022/04/26 Java/Android