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 相关文章推荐
JS实现侧悬浮浮动实例代码
Nov 29 Javascript
javascript计算用户打开网页的停留时间
Jan 09 Javascript
网页运行时提示对象不支持abigimage属性或方法
Aug 10 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
video.js使用改变ui过程
Mar 05 Javascript
JavaScript实现简单生成随机颜色的方法
Sep 21 Javascript
微信小程序radio组件使用详解
Jan 31 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
May 30 jQuery
ES6入门教程之let、const的使用方法
Apr 13 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
Jun 14 Javascript
js实现简易计算器小功能
Nov 18 Javascript
前端JS获取URL参数的4种方法总结
Apr 05 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 循环删除无限分类子节点的实现代码
2013/06/21 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
JS设计模式之单例模式(一)
2017/09/29 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python 自动提交和抓取网页
2009/07/13 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
学习两会精神心得范文
2014/03/17 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
行政处罚事先告知书
2015/07/01 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP
浅析InnoDB索引结构
2021/04/05 MySQL
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS