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中的array数组使用技巧
Jan 31 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
Aug 01 Javascript
jQuery ui插件的使用方法代码实例
May 08 Javascript
JQuery for与each性能比较分析
May 14 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
Feb 03 Javascript
详解Javascript中的Object对象
Feb 28 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
vue监听滚动事件实现滚动监听
Apr 11 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
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命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
jquery动态加载图片数据练习代码
2011/08/04 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
vue实现购物车的监听
2020/04/20 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
python实现自动重启本程序的方法
2015/07/09 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python源文件的字符编码知识点详解
2021/03/04 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
青奥会口号
2014/06/12 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2014年班主任工作总结
2014/11/08 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
基于python实现银行管理系统
2021/04/20 Python