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 相关文章推荐
基于jQuery的左右滚动实现代码
Dec 03 Javascript
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
JavaScript返回上一页的三种方法及区别介绍
Jul 04 Javascript
正则 js分转元带千分符号详解
Mar 08 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
Vue.js中的computed工作原理
Mar 22 Javascript
vue项目中api接口管理总结
Apr 20 Javascript
Vue内部渲染视图的方法
Sep 02 Javascript
jQuery操作选中select下拉框的值代码实例
Feb 07 jQuery
vue proxy 的优势与使用场景实现
Jun 15 Javascript
Vue scoped及deep使用方法解析
Aug 01 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 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 代码优化之经典示例
2011/03/24 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
Three.js基础学习教程
2017/11/16 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
Python 3.8 新功能全解
2019/07/25 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
信息部岗位职责
2013/11/12 职场文书
事务机电主管工作职责
2014/02/25 职场文书
《守株待兔》教学反思
2014/03/01 职场文书
先进个人事迹材料
2014/12/29 职场文书
篮球赛新闻稿
2015/07/17 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
JavaScript实现栈结构详细过程
2021/12/06 Javascript