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 相关文章推荐
看了就知道什么是JSON
Dec 09 Javascript
jQuery AJAX 调用WebService实现代码
Mar 24 Javascript
javascript函数以及基础写法100多条实用整理
Jan 13 Javascript
jquery if条件语句的写法
May 19 Javascript
js轮播图代码分享
Jul 14 Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
Angular1.x自定义指令实例详解
Mar 01 Javascript
jquery实现超简单的瀑布流布局【推荐】
Mar 08 Javascript
借助node实战JSONP跨域实例
Mar 30 Javascript
AngularJS 验证码60秒倒计时功能的实现
Jun 05 Javascript
js实现3D旋转相册
Aug 02 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
PHP 和 COM
2006/10/09 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php模拟post提交数据的方法
2015/02/12 PHP
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
jQuery实现简单QQ聊天框
2020/08/27 jQuery
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Djang中静态文件配置方法
2015/07/30 Python
Python断言assert的用法代码解析
2018/02/03 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
高中课前三分钟演讲稿
2014/09/13 职场文书
80后婚前协议书范本
2014/10/24 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android