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 event使用方法详解
Apr 28 Javascript
JavaScript中获取样式的原生方法小结
Oct 08 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
ajax+jQuery实现级联显示地址的方法
May 06 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
JS实现页面数据无限加载
Sep 13 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
JS实现的抛物线运动效果示例
Jan 30 Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 Javascript
JS实现字符串翻转的方法分析
Aug 31 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
JS判断数组里是否有重复元素的方法小结
May 21 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
js将json格式内容转换成对象的方法
2013/11/01 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
Python下载指定页面上图片的方法
2016/05/12 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
python实现简单多人聊天室
2018/12/11 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
养殖行业的创业计划书
2014/01/05 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
四风之害观后感
2015/06/09 职场文书
导游词之襄阳古城
2019/09/27 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js