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 相关文章推荐
JS动画效果打开、关闭层的实现方法
May 09 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
Angularjs整合微信UI(weui)
Mar 15 Javascript
jQuery下拉框的简单应用
Jun 24 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
详解JavaScript数组过滤相同元素的5种方法
May 23 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
微信小程序实现自定义加载图标功能
Jul 19 Javascript
Angular7.2.7路由使用初体验
Mar 01 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
Aug 31 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP入门学习笔记之一
2010/10/12 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
JS backgroundImage控制
2009/05/19 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
python调用webservice接口的实现
2019/07/12 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
python生成大写32位uuid代码
2020/03/03 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
详解CSS3:overflow属性
2020/11/17 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
职专应届生求职信
2013/11/16 职场文书
民间个人借款协议书
2014/09/30 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
导游词之塘栖古镇
2019/12/04 职场文书