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实现简单验证码提示解决方案
Dec 20 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
Json按某个键的值进行排序
Dec 22 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
基于vue2.x的电商图片放大镜插件的使用
Jan 22 Javascript
JS中判断字符串存在和非空的方法
Sep 12 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
Nov 19 Javascript
详解Typescript 内置的模块导入兼容方式
May 31 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php session和cookie使用说明
2010/04/07 PHP
php中转义mysql语句的实现代码
2011/06/24 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
php 输入输出流详解及示例代码
2016/08/25 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
JavaScript Archive Network 集合
2007/05/12 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
python爬取51job中hr的邮箱
2016/05/14 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
小学校园活动策划
2014/01/30 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
销售合作意向书范本
2015/05/08 职场文书
统招统分证明
2015/06/23 职场文书
律师催款函范文
2015/06/24 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android