



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
桶排序概念、思想及应用全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设 ,来避免绝大多数的“比较”操作。桶排序就是这样的原理。桶排序的基本思想 假设有一组长度为N的待排关键字序列K1.n。首先将这个序列划分成M个的子区间(桶) 。然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就作为Bi中的元素(每个桶Bi都是一组大小为N/M的序列)。接着对每个桶Bi中的所有元素进行比较排序(可以使用快排)。然后依次枚举输出B0.BM中的全部内容即是一个有序序列。 桶关键字映射函数 bindex=f(key) 其中,bindex 为桶数组B的下标(即第bindex个桶), k为待排序列的关键字。桶排序之所以能够高效,其关键在于这个映射函数,它必须做到:如果关键字k1k2,那么f(k1)=f(k2)。也就是说B(i)中的最小数据都要大于B(i-1)中最大数据。很显然,映射函数的确定与数据本身的特点有很大的关系,我们下面举个例子: 假如待排序列K= 49、 38 、 35、 97 、 76、 73 、 27、 49 。这些数据全部在1100之间。因此我们定制10个桶,然后确定映射函数f(k)=k/10。则第一个关键字49将定位到第4个桶中(49/10=4)。依次将所有关键字全部堆入桶中,并在每个非空的桶中进行快速排序后得到如下图所示:对上图只要顺序输出每个Bi中的数据就可以得到有序序列了。 桶排序代价分析桶排序利用函数的映射关系,减少了几乎所有的比较工作。实际上,桶排序的f(k)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶)。然后只需要对桶中的少量数据做先进的比较排序即可。 对N个关键字进行桶排序的时间复杂度分为两个部分:(1) 循环计算每个关键字的桶映射函数,这个时间复杂度是O(N)。(2) 利用先进的比较排序算法对每个桶内的所有数据进行排序,其时间复杂度为 O(Ni*logNi) 。其中Ni 为第i个桶的数据量。 很显然,第(2)部分是桶排序性能好坏的决定因素。尽量减少桶内数据的数量是提高效率的唯一办法(因为基于比较排序的最好平均时间复杂度只能达到O(N*logN)了)。因此,我们需要尽量做到下面两点:(1) 映射函数f(k)能够将N个数据平均的分配到M个桶中,这样每个桶就有N/M个数据量。(2) 尽量的增大桶的数量。极限情况下每个桶只能得到一个数据,这样就完全避开了桶内数据的“比较”排序操作。 当然,做到这一点很不容易,数据量巨大的情况下,f(k)函数会使得桶集合的数量巨大,空间浪费严重。这就是一个时间代价和空间代价的权衡问题了。 对于N个待排数据,M个桶,平均每个桶N/M个数据的桶排序平均时间复杂度为: O(N)+O(M*(N/M)*log(N/M)=O(N+N*(logN-logM)=O(N+N*logN-N*logM)当N=M时,即极限情况下每个桶只有一个数据时。桶排序的最好效率能够达到O(N)。 总结: 桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。 当然桶排序的空间复杂度 为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。 其实我个人还有一个感受:在查找算法中,基于比较的查找算法最好的时间复杂度也是O(logN)。比如折半查找、平衡二叉树、红黑树等。但是Hash表却有O(C)线性级别的查找效率(不冲突情况下查找效率达到O(1)。大家好好体会一下:Hash表的思想和桶排序是不是有一曲同工之妙呢? 桶排序在海量数据中的应用 一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,没有小数,你把这500 万元素的数组排个序。 分析:对500W数据排序,如果基于比较的先进排序,平均比较次数为O(5000000*log5000000)1.112亿。但是我们发现,这些数据都有特殊的条件: 100=score=900。那么我们就可以考虑桶排序这样一个“投机取巧”的办法、让其在毫秒级别就完成500万排序。 方法:创建801(900-100)个桶。将每个考生的分数丢进f(score)=score-100的桶中。这个过程从头到尾遍历一遍数据只需要500W次。然后根据桶号大小依次将桶中数值输出,即可以得到一个有序的序列。而且可以很容易的得到100分有*人,501分有*人。 实际上,桶排序对数据的条件有特殊要求,如果上面的分数不是从100-900,而是从0-2亿,那么分配2亿个桶显然是不可能的。所以桶排序有其局限性,适合元素值集合并不大的情况。源代码#include #include typedef struct node int key; struct node * next; KeyNode; void inc_sort(int keys,int size,int bucket_size) KeyNode *bucket_table=(KeyNode *)malloc(bucket_size*sizeof(KeyNode *); for(int i=0;ikey=0; /记录当前桶中的数据量 bucket_tablei-next=NULL; for(int j=0;jkey=keysj; node-next=NULL; /映射函数计算桶号 int index=keysj/10; /初始化P成为桶中数据链表的头指针 KeyNode *p=bucket_tableindex; /该桶中还没有数据 if(p-key=0) bucket_tableindex-next=node; (bucket_tableindex-key)+; else /链表结构的插入排序 while(p-next!=NULL&p-next-keykey) p=p-next; node-next=p-next; p-next=node; (bucket_tableindex-key)+; /打印结果 for(int b=0;bnext; k!=NULL; k=k-next) coutkey ; coutendl; void main() i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗设备的保修合同范本
- 共享茶室的协议合同范本
- 公司向股东借款合同协议
- app研发外包合同范本
- 低价园林场出租合同范本
- 合同中关于另立补充协议
- 卖车员工入职合同协议书
- 2025-2026学年江西省南昌市东湖区第十中学高三数学第一学期期末教学质量检测模拟试题
- 亲戚之间的租车合同范本
- 压铸机设备租赁合同范本
- 2023年6月英语六级考试真题及答案解析(全3套)
- 高中数学 人教A版 必修一 《集合与常用逻辑用语》 1.1集合的概念
- 深圳某电厂锅炉维修改造施工组织设计-new(常用版)
- GB/T 4950-2021锌合金牺牲阳极
- 中药调剂技术-课件
- 证券从业考试基础模拟卷二(题目+解析)
- 水轮发电机讲义课件
- 信息系统运维服务方案
- 化工试生产总结报告
- 导数与原函数的对称性 微专题课件-2023届高三数学一轮复习
- 刑法各论(第四版全书电子教案完整版ppt整套教学课件最全教学教程)
评论
0/150
提交评论