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实现CheckBox的全选与取消全选的代码
Jul 20 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
Aug 10 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
使用typeof方法判断undefined类型
Sep 09 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
vue侧边栏动态生成下级菜单的方法
Sep 07 Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 Javascript
vue中get请求如何传递数组参数的方法示例
Nov 08 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
Apr 30 jQuery
微信小程序实现电子签名功能
Jul 29 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
python dataframe NaN处理方式
2019/12/26 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
Python扫描端口的实现
2021/01/25 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
活动邀请函范文
2014/01/19 职场文书
大学生活动策划方案
2014/02/10 职场文书
生产厂长岗位职责
2014/02/21 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
如何写好闭幕词
2019/04/02 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript