JavaScript中的排序算法代码


Posted in Javascript onFebruary 22, 2011

作为排序依据的数据项称为“排序码”,也即数据元素的关键码。为了便于查找,通常希望计算机中的数据表是按关键码有序的。如有序表的折半查找,查找效率较高。还有,二叉排序树、B-树和B+树的构造过程就是一个排序过程。若关键码是主关键码,则对于任意待排序序列,经排序后得到的结果是唯一的;若关键码是次关键码,排序结果可能不唯一,这是因为具有相同关键码的数据元素,这些元素在排序结果中,它们之间的的位置关系与排序前不能保持。
若对任意的数据元素序列,使用某个排序方法,对它按关键码进行排序:若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;而不能保持一致的排序方法则称为不稳定的。
排序分为两类:内排序和外排序。
内排序:指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。
外排序:指排序过程中还需访问外存储器,足够大的元素序列,因不能完全放入内存,只能使用外排序。

现在贴3种排序算法的JavaScript实现。

首先是最简单的,是个人都会的冒泡排序。就不多说了,直接贴代码

/** @name 冒泡排序 
* @lastmodify 2010/07/13 
* @desc 比较排序 
复杂度为O(n*n) 
*/ 
function BubbleSort(list){ 
var len = list.length; 
var cl,temp; 
while(len--){ 
cl = list.length; 
while(cl--){ 
if(list[cl]>list[len] && cl < len){ 
temp = list[len]; 
list[len] = list[cl]; 
list[cl] = temp; 
} 
} 
} 
return list; 
}

然后是最常见的快速排序,面试基本上都会问到。
/** @name 快速排序 
* @lastmodify 2010/07/14 
* @desc 比较排序 
最差运行时间O(n*n); 
最好运行时间O(nlogn) 
*/ 
function QuickSort(list){ 
var i = 0; 
var j = list.length; 
var len = j; 
var left; 
var right; 
var k = findK(i , j); 
if(k != 0){ 
var leftArr = []; 
var rightArr = []; 
var midArr = [list[k]]; 
while(len--) { 
if(len != k){ 
if(list[len] > list[k]){ 
rightArr.push(list[len]); 
} 
else{ 
leftArr.push(list[len]); 
} 
} 
} 
left = QuickSort(leftArr); 
right = QuickSort(rightArr); 
list = left.concat(midArr).concat(right); 
} 
return list; 
} function findK(i,j){ 
//默认找它的中间位置 
return Math.floor((i + j) / 2); 
}

快速排序的主要思想就是分治法,将被排序的序列分割为2块,从而将排序的复杂度降低。递归的巧用也是快速排序的精妙之处。在上个例子中,首先使用findK函数找出“参照元素”,其他元素依次和该元素进行比较,所有比其大的放入一个集合中,比其小的放入另外一个集合中,再分别对两个集合进行排序。快速排序的效率主要取决于findK函数的实现和待排序元素的有序程度。因此,快速排序是一个不稳定的排序算法。

但是快速排序仍然是一个基于比较的排序算法。所有基于比较的排序算法有一个特点,就是无论怎样优化,它对于一个元素集合的平均排序时间总是随着该集合元素数量的增加而增加。而非比较的排序很好的克服了这个缺点,它们试图让排序时间复杂度趋于一个数量无关的稳定值。其中比较有代表性的就是桶排序了。先看看它的JavaScript实现。

/** @name 桶排序 
* @author lebron 
* @lastmodify 2010/07/15 
* @desc 非比较排序 
*/ 
function BucketSort(list) { 
var len = list.length; 
var range = findMax(list); 
var result = [], 
count = []; 
var i,j; 
for (i = 0; i < range; i++) { 
count.push(0); 
} for ( j = 0; j < len; j++) { 
count[list[j]]++; 
result.push(0); 
} 
for (i = 1; i < range; i++) { 
count[i] = count[i-1] + count[i]; 
} 
for (j = len - 1; j >= 0; j--) { 
result[count[list[j]]] = list[j]; 
count[list[j]]--; 
} 
return result; 
} 
function findMax(list) { 
return MAX; 
}

可以看到,在桶排序的实现中,仍然使用了一个findMax函数来确定一个大数组的范围,这里直接用一个常量MAX来代替。首先初始化一个大数组count,长度为MAX。在将被排序集合里面的值放入到对应的位置上去,比如有一个元素值为24,那么count的第24位被标记为1,同时result数组长度+1。再计算出count数组中标志为1的元素位置在整个count数组中标志为1的排位。此时count数组中,第n个元素的值,就应当是排序后它的位置,而n这是这个排序后这个位置对应的值。所以,最后再一一的将count数组里面的键值倒过来映射入结果数组中即可。
桶排序巧妙的利用了这样一种思想,如果一个元素它在一个集合中是第n大的,那么它应该排第n位,而无需关心它前一位或者后一位是比它大还是比它小(无需比较)。很显然的是,在实际情况中,被排序集合的元素的值的范围很可能远远大于这个集合的元素数量,因此,也需要分配相应的一个巨大空间的数组才行。因此,桶排序的常见场景是在外排序上面。

有兴趣的同学,可以测试下3种排序在不同数量级下的耗时。

Javascript 相关文章推荐
JS启动应用程序的一个简单例子
May 11 Javascript
JavaScript实现找出字符串中第一个不重复的字符
Sep 03 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
每天一篇javascript学习小结(Array数组)
Nov 11 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
Jun 06 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
微信小程序转发事件实现解析
Oct 22 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 Javascript
JavaScript中几种常见排序算法小结
Feb 22 #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
You might like
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python查找相似单词的方法
2015/03/05 Python
Python连接数据库学习之DB-API详解
2017/02/07 Python
python机器学习库常用汇总
2017/11/15 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
保送生自荐信范文
2013/10/06 职场文书
培训主管岗位职责
2014/02/01 职场文书
食品安全宣传标语
2014/06/07 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python