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 相关文章推荐
Javascript 继承实现例子
Aug 12 Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
Mar 28 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
javascript常用函数(2)
Nov 05 Javascript
轻松掌握JavaScript装饰者模式
Aug 27 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
简易Vue评论框架的实现(父组件的实现)
Jan 08 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
如何使用CocosCreator对象池
Apr 14 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
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
xml转json的js代码
2012/08/28 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
Vue实现导出excel表格功能
2018/03/30 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
vue项目接口域名动态获取操作
2020/08/13 Javascript
Python fileinput模块使用介绍
2014/11/30 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
实例介绍Python中整型
2019/02/11 Python
python excel转换csv代码实例
2019/08/26 Python
简单介绍django提供的加密算法
2019/12/18 Python
Python argparse模块使用方法解析
2020/02/20 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
Python3.9新特性详解
2020/10/10 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
就业协议书盖章的注意事项
2014/09/28 职场文书
廉政承诺书
2015/01/19 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
用javascript制作qq注册动态页面
2021/04/14 Javascript