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.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
Jul 28 Javascript
javascript Slip.js实现整屏滑动的手机网页
Nov 25 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
Nov 01 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
Mar 17 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
细说webpack源码之compile流程-rules参数处理技巧(2)
Dec 26 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
vue input标签通用指令校验的实现
Nov 05 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
Feb 06 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
Augularjs-起步详解
2016/07/08 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Python工厂函数用法实例分析
2018/05/14 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
Python 使用type来定义类的实现
2019/11/19 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
Tensorflow累加的实现案例
2020/02/05 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
jupyter notebook实现显示行号
2020/04/13 Python
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
实习自我鉴定
2013/12/15 职场文书
高三英语复习计划
2015/01/19 职场文书
小学大队长竞选稿
2015/11/20 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
JavaScript实现登录窗体
2021/06/22 Javascript