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 相关文章推荐
兼容IE与firefox火狐的回车事件(js与jquery)
Oct 20 Javascript
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
利用jquery操作Radio方法小结
Oct 20 Javascript
基于jquery实现全屏滚动效果
Nov 26 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
Jun 03 Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 Javascript
jQuery.datatables.js插件用法及api实例详解
Oct 28 Javascript
Javascript异步编程async实现过程详解
Apr 02 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
Apr 06 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
Nov 12 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 Javascript
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编程过程中需要了解的this,self,parent的区别
2009/12/30 PHP
php学习之流程控制实现代码
2011/06/09 PHP
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
JQuery toggle使用分析
2009/11/16 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
javascript事件模型介绍
2016/05/31 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python之wxPython应用实例
2014/09/28 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python已协程方式处理任务实现过程
2019/12/27 Python
python实现图像拼接功能
2020/03/23 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
应届生服务员求职信
2013/10/31 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
推荐信怎么写
2014/05/09 职场文书
球队口号
2014/06/18 职场文书
成本会计岗位职责
2015/02/03 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
小学六年级毕业感言
2015/07/30 职场文书