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代码
Jul 19 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
基于javascript实现listbox左右移动
Jan 29 Javascript
快速使用Bootstrap搭建传送带
May 06 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 Javascript
简单封装js的dom查询实例代码
Jul 08 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
vue.js内置组件之keep-alive组件使用
Jul 10 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
原生JavaScript实现随机点名表
Jan 14 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笔记之:文章中图片处理的使用
2013/04/26 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[19:15]DK战队纪录片
2014/09/02 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
Python中super函数的用法
2017/11/17 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
python中return如何写
2020/06/18 Python
Python基于locals返回作用域字典
2020/10/17 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
中青班党性分析材料
2014/02/16 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
2014年统计工作总结
2014/11/21 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
2016年记者节感言
2015/12/08 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书