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 相关文章推荐
创建一个复制UBB软件信息的链接或按钮的js代码
Jan 06 Javascript
CSS和Javascript简单复习资料
Jun 29 Javascript
javascript string字符串优化问题
Jul 31 Javascript
jQuery实现视频作为全屏幕背景
Dec 18 Javascript
跟我学习javascript的基本类型和引用类型
Nov 16 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
AngularJs  Understanding Angular Templates
Sep 02 Javascript
Angularjs 实现动态添加控件功能
May 25 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
Sep 26 Javascript
js获取文件里面的所有文件名(实例)
Oct 17 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 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
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
零基础php编程好学吗
2019/10/11 PHP
javascript 写类方式之五
2009/07/05 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
Python中http请求方法库汇总
2016/01/06 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
python 星号(*)的多种用途
2020/09/21 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
给水工程专业毕业生自荐信
2014/01/28 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
同意迁入证明模板
2014/10/26 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
会计岗位职责范本
2015/04/02 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS