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 Demo模态窗口
Dec 06 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
Mar 02 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
JavaScript中闭包之浅析解读(必看篇)
Aug 25 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
linux 后台运行node服务指令方法
May 23 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
vue2和vue3的v-if与v-for优先级对比学习
Oct 10 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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
php导出生成word的方法
2015/12/25 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
Javascript 继承机制实例
2009/08/12 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
在Django中创建第一个静态视图
2015/07/15 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
文明单位创建材料
2014/12/24 职场文书
大学生毕业个人总结
2015/02/15 职场文书
红歌会主持词
2015/07/02 职场文书
《植树问题》教学反思
2016/03/03 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers