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 相关文章推荐
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
JavaScript的继承的封装介绍
Oct 15 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
node.js下LDAP查询实例分享
Sep 30 Javascript
JS中setTimeout和setInterval的最大延时值详解
Feb 13 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
Apr 13 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 Javascript
微信小程序自定义导航栏实例代码
Apr 05 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
php5数字型字符串加解密代码
2008/04/24 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
javascript基础知识讲解
2017/01/11 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Python中常见的异常总结
2018/02/20 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
房地产项目策划书
2014/02/05 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
行政人事专员岗位职责
2015/04/07 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书