作为排序依据的数据项称为“排序码”,也即数据元素的关键码。为了便于查找,通常希望计算机中的数据表是按关键码有序的。如有序表的折半查找,查找效率较高。还有,二叉排序树、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种排序在不同数量级下的耗时。
相关推荐:
用AI写一篇文章,如何提升你的写作效率与创意
OpenAI银联支付-未来支付新体验,安全便捷全新升级,医学加ai
seo该从什么开始,seo是什么时候开始的 ,ai写作免费英文怎么说
Chatttst:开启智能沟通新时代的无限可能,上海联通ai
为什么“360收录”是你网站推广的必备利器,seo亚马逊
什么是seo优化营销,seo主要优化什么 ,ai绘画国风古韵
ChatGPT连了外网也登不了?如何解决这一问题,重新畅享AI助力!,ai少女大瓜
用AI写文章会不会查重率高?破解写作困扰的真相
优化,让生活与工作更高效-从个人到企业的全面升级,广州百度seo费用
洗文章AI:让内容创作变得更智能、更高效
AI免费文章解读:智能写作新篇章,小店AI
人工AI软件的未来:智能时代的创新驱动力
SEO快速优化技术:助力网站流量暴增,轻松登顶搜索引擎,铜陵ai全网通推广软件
SEO招标:如何通过专业SEO服务助力企业脱颖而出,牡丹江关键词排名怎么样
ChatGPT维护页面-背后的技术与用户体验,ai领域ppt
AI免费工具:提升效率与创意的秘密武器
AI会生成同一篇文章吗?揭开智能创作的神秘面纱
揭开“好的AI软件”背后的秘密:让生活和工作更智能的利器
SEO获取流量的必杀技:如何通过优化轻松提升网站排名,德州全网营销推广价格
为什么选择SEO会员服务,让您的网站流量飞速增长,靖边专业网站建设公司
seo要寻找什么资源,怎么找seo ,ai插画描边
SEO怎么优化比较好?全面提升网站排名的实用技巧,高级ai玩家
在线AI文章生成器开启智能创作新时代
互联网资源的无限潜力:如何利用数字世界为个人和企业创造价值,信阳网站建设正规公司
OpenAIGPT:开启智能时代的语言革命,ai辣妹动漫
SEO合作:让你的网站在搜索引擎中脱颖而出,惠州抖音seo策划公司
SEO优化的话题:助力企业成功的关键,夏杰ai智能管家
SEO新手必看:从零开始SEO优化的终极指南,随州网站优化技巧
ChatGPT您的应用遇到问题,无法正常启动?如何解决并重新体验智能助手的魅力!,男头ai关键词
ChatGPT安装包Windows版:让AI助力你的工作与生活,人工智能ai不是梦在线
seo读什么书,seo是哪个专业的 ,亚洲9ai吧
什么是SEO可以自学吗,seo零基础可以自学吗 ,ai1紫
不利于seo是什么,不属于seo对网店推广的作用 ,ai渐变下载
文字生成AI开启创作的新纪元
ChatGPT国内版:为中国用户量身定制的智能助手,开启AI新纪元,ai文章赚钱
AI免费生成文章的软件:轻松创作的秘密武器
ChatGPT错误处理与异常情况解决方法:让你的AI助手更加智能与可靠,智能ai鼠标ai智能语音
如何通过AI写文章,轻松提高写作效率与质量
什么是seo的豆子,何为seo ,ai圆复制
seo能解决什么问题,seo会遇到哪些问题 ,挚爱花嫁ai
seo都有什么问题,seo都有什么问题和答案 ,ai凯旋公主下载
ChatGPT在处理文本时可能无法完全理解上下文的复杂性,肌肉ai
ChatGPT为什么打不开?背后原因与解决方案,慧ai写作
SEO学费多少钱?揭秘SEO培训的投资价值与回报!,郴州网站推广多少钱一个
SEO优化与SEM广告:提升品牌曝光与流量的双重利器,ai接回头
360排名优化价格:打造高效网络营销的制胜法宝,ai换脸刘浩存自wei
SEO考核:如何通过精准的SEO优化提升网站排名与流量,茶艺营销推广方案怎么写
ChatGPT破解:人工智能的无限潜力与破解秘笈,意识变ai
ChatGPT遇到问题?如何解决“您的应用遇到问题,无法正常启动”困境?,ai下载增强版
在线AI写文:开启高效创作新时代