Bucket_Sort and Radix_Sort
来源:互联网 发布:python读写数据txt 编辑:程序博客网 时间:2024/06/03 12:34
这个是原文地址 点此连接。
桶式排序
桶式排序的原理是:利用待排序序列元素的值作为新序列的索引进行插入,完成新序列的建立后,只需对新序列进行遍历即可完成排序(具体遍历过程和新序列元素的值有关)
假设有N个整数的序列,范围从0到M-1。现建立一个名为Count的桶序列,长度为M,并初始化为0。于是,Count有M个桶,开始时都是空的。对待排序序列进行遍历,当遍历至原序列元素Ai时,Count[Ai]增1。Count序列建立完毕后,对其进行遍历,遍历输出的不是Count序列元素的值,而是其索引,每个索引输出的次数由其对应元素的值决定,元素值为0则不输出
代码
#include<iostream>using namespace std;void bucket_sort(int m, int n, int a[]){ //m为待排序序列元素值取范的上限(下限默认为0),n为序列长度,a为原序列int *b=new int[m]; //注意新序列长度不是n而是mfor(int i=0;i<m;i++) //初始化b[i]=0;for(i=0;i<n;i++) //由原序列获得新序列b[a[i]]++;int j;for(i=0,j=0;i<m;i++){ //输出新序列if(b[i]!=0){for(int k=0;k<b[i];k++){a[j]=i;j++;}}}}int main(){int a[10]={8,65,23,5,56,9,23,56,99,12};bucket_sort(100,10,a);for(int i=0;i<10;i++)cout<<a[i]<<" ";cout<<endl;return 0;}
桶式排序的局限性在于
- 待排序序列元素的值只能为整数
- 若待排序序列元素值的取值范围很大,则Count序列需占用很大空间,而实际上得到的Count序列是很稀疏的
基数排序
相比于桶式排序,基数排序仍只适用于元素值为整数的序列,但它的Count序列空间占用比桶式排序小得多
基数排序是桶式排序的推广,设待排序序列长度为M,取值范围为0到N^p-1,N即为基数,p为指数。对于基数排序,我们只需要一个长度为N的Count序列和p趟排序即可完成
我们进行p趟排序,每次以元素值的某一“位”(对基数N所取的位,基数为10时就是一般定义上的位)为关键字进行排序,每趟都是一次桶式排序,顺序必须是先从最低“位”开始排序,最后对最高“位”排序
根据上述分析,相比于桶式排序,基数排序有以下特性
- Count序列是一个二维矩阵,大小为N×M(一般来说,其空间占用远小于桶式排序)
- 桶式排序的Count序列是一维列表,这是因为同一桶内的元素的值必定相同;而基数排序的同一桶内的元素只是针对该趟对应的“位”相同,元素值不一定相同,因此桶还需要一定的“高度”来记录不同的元素值,以免混淆
- 实际应用中,N和p是可以任意取值的,只要保证待排序序列的取值范围为0到N^p-1即可。但另一方面,基数N决定了空间复杂度,指数p决定了时间复杂度,需要一定平衡
代码
#include<iostream>#include<math.h>using namespace std;void radix_sort(int m, int n, int p, int a[]){ //m代表待排序序列长度,n代表基数,p代表元素最大的位数,a代表待排序序列int **b=new int*[n]; //b代表count序列for(int i=0; i<n;i++)b[i]=new int[m];for(int t=1;t<=p;t++){ //p趟排序for(i=0;i<n;i++){ //每趟都要对count序列初始化为0for(int j=0;j<m;j++){b[i][j]=0;}}int *c=new int[n]; //记录桶的高度for(int x=0;x<n;x++)c[x]=0;for(int j=0; j<m;j++){int k=(a[j]%(int)pow(n,t))/pow(n,t-1); //关键:获得该趟对应的“位”,根据该“位”将元素放入对应的桶中b[k][c[k]]=a[j];c[k]++; //同时要增加对应桶的高度}int k=0;for(int i=0; i<n; i++){ //单趟cnt序列建立完毕后,将其输出回序列a,以便下一趟的排序for(int j=0;j<c[i]; j++){a[k]=b[i][j];k++;}}}}int main(){int a[8]={1183,1263,2574,92,5447,3988,6774,8474};int m=8;int n=10;int p=4;radix_sort(m,n,p,a);for(int i=0;i<8;i++)cout<<a[i]<<" ";cout<<endl;return 0;}
- Bucket_Sort and Radix_Sort
- radix_sort
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings __ greedy and Bucket_sort
- 桶排序(Bucket_sort)
- [数据结构]Radix_sort(MSD)
- 桶排序(Bucket Sort),基数排序(Radix_Sort)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(一)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(二)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(三)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(四)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(五)
- AMD OpenCL例子阅读笔记系列之Radix_Sort(六)
- " and '
- $* and $@
- AND
- AND
- & and &&
- ""and ‘’
- 映射模式/视口(viewport)和窗口(window)
- 解决mysql“Access denied for user 'root'@'localhost'”
- eclipse 安装svn插件的几种方式
- 关于.net框架
- Effective STL 摘要
- Bucket_Sort and Radix_Sort
- Eclipse的代码追踪功能
- 在ASP.NET中动态加载内容(用户控件和模板)
- C语言sizeof 与 strlen的比较
- Python 学习笔记【文件对象】
- SVN库迁移的心得
- SSH 连接linux 设定ip的方法
- ubuntu网络配置
- win7中iis7.5中没有http绑定类型的解决方法