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 相关文章推荐
基于jquery实现的鼠标滑过按钮改变背景图片
Jul 15 Javascript
使用js显示当前时间示例
Mar 02 Javascript
深入理解Javascript里的依赖注入
Mar 19 Javascript
javascript + jquery实现定时修改文章标题
Mar 19 Javascript
Vue.js开发环境快速搭建教程
Mar 17 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
js实现可以点击收缩或张开的悬浮窗
Sep 18 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 Javascript
Vue框架TypeScript装饰器使用指南小结
Feb 18 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
Vue时间轴 vue-light-timeline的用法说明
Oct 29 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 命令行参数详解及应用
2011/05/18 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
php json与xml序列化/反序列化
2013/10/28 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
物业管理求职自荐信
2013/09/25 职场文书
实习生体会的自我评价范文
2013/11/28 职场文书
小学家长学校培训材料
2014/08/24 职场文书
车贷收入证明范本
2014/09/14 职场文书
中国世界遗产导游词
2015/02/13 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
市场营销计划书
2019/04/24 职场文书
海弦WR-800F
2022/04/05 无线电
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技
JavaScript实现简单的音乐播放器
2022/08/14 Javascript