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 dom 基本操作小结
Apr 11 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
Oct 06 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
React diff算法的实现示例
Apr 20 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
Feb 04 Javascript
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
vue 监听 Treeselect 选择项的改变操作
Aug 31 Javascript
js+audio实现音乐播放器
Sep 13 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 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
一篇不错的Python入门教程
2007/02/08 Python
pyside写ui界面入门示例
2014/01/22 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python中defaultdict的用法详解
2017/06/07 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
python+tkinter实现学生管理系统
2019/08/20 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
护理学毕业生求职信
2013/11/14 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
公司周年庆典标语
2014/10/07 职场文书
植物园观后感
2015/06/11 职场文书
职工培训工作总结
2015/08/10 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
MySQL sql模式设置引起的问题
2022/05/15 MySQL