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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
Dec 04 Javascript
三种带箭头提示框总结实例
Jun 14 Javascript
jQuery UI制作选项卡(tabs)
Dec 13 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
Mar 16 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
Vue.directive使用注意(小结)
Aug 31 Javascript
小程序实现锚点滑动效果
Sep 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维护文件系统
2006/10/09 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
写的htc的数据表格
2007/01/20 Javascript
Javascript 构造函数 实例分析
2008/11/26 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python中class的定义及使用教程
2019/09/18 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
犯错检讨书
2014/02/21 职场文书
家长学校实施方案
2014/03/15 职场文书
生活部的活动方案
2014/08/19 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
升学宴学生致辞
2015/07/27 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
python实现过滤敏感词
2021/05/08 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL