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 相关文章推荐
jscript之Open an Excel Spreadsheet
Jun 13 Javascript
一个基于jquery的图片切换效果
Jul 06 Javascript
提高javascript效率 一次判断,而不要次次判断
Mar 30 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
Javascript 计算字符串在localStorage中所占字节数
Oct 21 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
Sep 09 Javascript
canvas绘制七巧板
Feb 03 Javascript
ES6中let 和 const 的新特性
Sep 03 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
初识laravel5
2015/03/02 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python实现维吉尼亚加密法
2019/03/20 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
python同时遍历两个list用法说明
2020/05/02 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
J2EE包括哪些技术
2016/11/25 面试题
中专自荐信
2013/10/13 职场文书
教师岗位职责
2013/11/17 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
小学生开学感言
2014/02/28 职场文书
党员干部承诺书范文
2014/03/25 职场文书
保证书范文大全
2014/04/28 职场文书
活动总结模板
2014/05/09 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
我爱我班主题班会
2015/08/13 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android