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 07 Javascript
js图片自动切换效果处理代码
May 07 Javascript
angularJS 中$attrs方法使用指南
Feb 09 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
js 调用百度分享功能
Feb 27 Javascript
webpack多入口多出口的实现方法
Aug 17 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 Javascript
JS实现在线ps功能详解
Jul 31 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
vue实现设置载入动画和初始化页面动画效果
Oct 28 Javascript
Vue.extend 登录注册模态框的实现
Dec 29 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 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
javascript add event remove event
2008/04/07 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
详解Python验证码识别
2016/01/25 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python3实现mysql导出excel的方法
2019/07/31 Python
python实现代码统计程序
2019/09/19 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
满月酒答谢词
2014/01/14 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
《燕子》教学反思
2014/02/18 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
关于幸福的感言
2015/08/03 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
mysql分表之后如何平滑上线详解
2021/11/01 MySQL