JavaScript中几种常见排序算法小结


Posted in Javascript onFebruary 22, 2011

说明
写这个主要是为了锻炼自己,并无实际意义。
每个浏览器测试得出的数据会不一样。比如我用chrome 测试 一般快速排序都会最快,IE 则根据数组长度有可能希尔最快。
不要用太大数据去测试冒泡排序(浏览器崩溃了我不管)
如果有兴趣可以 下载测试页面

个人理解

冒泡排序:最简单,也最慢,貌似长度小于7最优
插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势
快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合
希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快
系统方法:在forfox下系统的这个方法非常快

算法源码

// ---------- 一些排序算法 
// js 利用sort进行排序 
systemSort:function(array){ 
return array.sort(function(a, b){ 
return a - b; 
}); 
}, 
// 冒泡排序 
bubbleSort:function(array){ 
var i = 0, len = array.length, 
j, d; 
for(; i<len; i++){ 
for(j=0; j<len; j++){ 
if(array[i] < array[j]){ 
d = array[j]; 
array[j] = array[i]; 
array[i] = d; 
} 
} 
} 
return array; 
}, 
// 快速排序 
quickSort:function(array){ 
//var array = [8,4,6,2,7,9,3,5,74,5]; 
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7]; 
var i = 0; 
var j = array.length - 1; 
var Sort = function(i, j){ 
// 结束条件 
if(i == j ){ return }; 
var key = array[i]; 
var stepi = i; // 记录开始位置 
var stepj = j; // 记录结束位置 
while(j > i){ 
// j <<-------------- 向前查找 
if(array[j] >= key){ 
j--; 
}else{ 
array[i] = array[j] 
//i++ ------------>>向后查找 
while(j > ++i){ 
if(array[i] > key){ 
array[j] = array[i]; 
break; 
} 
} 
} 
} 
// 如果第一个取出的 key 是最小的数 
if(stepi == i){ 
Sort(++i, stepj); 
return ; 
} 
// 最后一个空位留给 key 
array[i] = key; 
// 递归 
Sort(stepi, i); 
Sort(j, stepj); 
} 
Sort(i, j); 
return array; 
}, 
// 插入排序 
insertSort:function(array){ 
// http://baike.baidu.com/image/d57e99942da24e5dd21b7080 
// http://baike.baidu.com/view/396887.htm 
//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7]; 
var i = 1, j, step, key, 
len = array.length; 
for(; i < len; i++){ 
step = j = i; 
key = array[j]; 
while(--j > -1){ 
if(array[j] > key){ 
array[j+1] = array[j]; 
}else{ 
break; 
} 
} 
array[j+1] = key; 
} 
return array; 
}, 
// 希尔排序 
//Jun.array.shellSort(Jun.array.df(10000)); 
shellSort:function(array){ 
// http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F 
// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10]; 
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; // reverse() 在维基上看到这个最优的步长 较小数组 
//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//针对大数组的步长选择 
var i = 0; 
var stepArrLength = stepArr.length; 
var len = array.length; 
var len2 = parseInt(len/2); 
for(;i < stepArrLength; i++){ 
if(stepArr[i] > len2){ 
continue; 
} 
stepSort(stepArr[i]); 
} 
// 排序一个步长 
function stepSort(step){ 
//console.log(step) 使用的步长统计 
var i = 0, j = 0, f, tem, key; 
var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step; for(;i < step; i++){// 依次循环列 
for(j=1;/*j < stepLen && */step * j + i < len; j++){//依次循环每列的每行 
tem = f = step * j + i; 
key = array[f]; 
while((tem-=step) >= 0){// 依次向上查找 
if(array[tem] > key){ 
array[tem+step] = array[tem]; 
}else{ 
break; 
} 
} 
array[tem + step ] = key; 
} 
} 
} 
return array; 
}

测试代码打包下载
Javascript 相关文章推荐
js 面向对象的技术创建高级 Web 应用程序
Feb 25 Javascript
jQuery.each()用法分享
Jul 31 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
Jquery解析json数据详解
Dec 26 Javascript
Javascript 读取操作Sql中的Xml字段
Oct 09 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
微信小程序-小说阅读小程序实例(demo)
Jan 12 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
php register_shutdown_function函数详解
Jul 23 Javascript
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
Vue中用JSON实现刷新界面不影响倒计时
Oct 26 Javascript
用JS控制回车事件的代码
Feb 20 #Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 #Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 #Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 #Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 #Javascript
基于jquery的复制网页内容到WORD的实现代码
Feb 16 #Javascript
Jquery之美中不足小结
Feb 16 #Javascript
You might like
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
深入浅出理解javaScript原型链
2015/05/09 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python selenium 三种等待方式解读
2016/09/15 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
如何写你的创业计划书
2014/01/07 职场文书
给朋友的道歉信
2014/01/09 职场文书
求职意向书范文
2014/04/01 职场文书
本科应届生求职信
2014/08/05 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
创业计划书之网吧
2019/10/10 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL