[Sort]基数排序-两种实现
来源:互联网 发布:淘宝登陆界面打不开 编辑:程序博客网 时间:2024/05/18 00:50
1、LSD-最低位优先
//获取数据中最大的位数(1)a[]为存储数据的数组。(2)为数组的个数int maxbit(int a[],int num){ int d =1; int p =10; for(int i=0;i<num;i++) { while(a[i] >= p) { p*=10; ++d; } } return d;}/*从低位开始桶排序*/void LSD_Radix_Sort(int a[],int num){ int d = maxbit(a,num); //获取最大位数 int *tmp = new int[num]; //创建临时存储数组。 int *count = new int[10]; //存放每个桶内记录的数目,0...9 int radix =1; //基数 int i,j,k; for(i=0;i<d;i++) { for(j=0;j<10;j++)//初始化count,每次换位都需要要重置一次。便于记录各桶的内记录的次数 count[j] = 0; for(j = 0;j<num;j++) { k = (a[j] / radix) %10; count[k] ++; } for(j=1;j<10;j++) { count[j] += count[j-1]; //从0到9,各桶内数据所在位置 } for(j=num-1;j >= 0;j--)//从后往前遍历,为了保证较大数据在较小数据后面 { k = (a[j] / radix) % 10; tmp[count[k] -1] = a[j]; count[k] --; } for(j=0;j<num;j++)//将临时数据赋给原数组,一次循环结束 { a[j] = tmp[j]; } radix *= 10; //基数扩大十倍,即往高位进一位。 } //释放 delete[] tmp; delete[] count;}
2、MSD-最高位优先
/*从高位开始桶排序,(1)a[]表示数组.(2)p表示当前的起始位置(3)所需排序的数据的数目(4)d表示位数*/void MSD_Radix_Sort(int a[],int p,int num,int d){ int* tmp = new int[num]; int* count = new int[10]; int* tempcount = new int[10];//存放临时的计数,为递归时各“小”桶排序准备 int i,j,k; int radix =1; for(i=0;i<d-1;i++) //基数放到最大,为获取高位 radix *= 10; for(i=0;i<10;i++) { count[i] = 0; tempcount[i] = 0; } for(i=p;i<p + num;i++) { k = (a[i] / radix) % 10; count[k]++; tempcount[k]++; } for(i=1;i<10;i++) { count[i] += count[i-1]; } for(i=p;i<p+num;i++)//将数组按次序排好,存到tmp中 { k = (a[i] / radix) % 10; tmp[count[k]-1] = a[i]; count[k] --; } for(i=p;i<p+num;i++) a[i] = tmp[i-p]; int v = 0; //对每个桶内的数据在进行下一轮的排序 for(i=0;i<10;i++) { if(d > 1 && tempcount[i] != 0) { MSD_Radix_Sort(a,v,tempcount[i],d-1); v += tempcount[i]; } } delete[] tmp; delete[] count; delete[] tempcount; }
3、main函数:
void main(){ int a[] = {57,68,59,52,72,28,96,33,24}; int count = sizeof(a) / sizeof(a[0]); LSD_Radix_Sort(a,count); //int d = maxbit(a,count); //MSD_Radix_Sort(a,0,count,d); for(int i=0;i<count;i++) { cout<<a[i]<<" "; } cout<<endl;}
0 0
- [Sort]基数排序-两种实现
- 基数排序的两种实现方法--Radix Sort
- 经典算法之基数排序两种实现
- 基数排序(Radix Sort)的代码实现
- C++实现基数排序(radix sort)
- leetcode-Sort Characters By Frequency(基数排序实现)
- [Sort]插入排序-两种实现
- 基数排序(Radix Sort)——java实现
- PHP实现排序算法----基数排序(Radix Sort)
- 插入排序算法(Insertion Sort)的两种实现
- 泛型,Quick Sort 的C/C++两种实现方式
- Radix Sort 基数排序
- radix sort 基数排序
- 基数排序(Radix Sort)
- 基数排序 (Radix sort)
- hdu 1425 sort (基数排序)
- 基数排序(radix sort)
- 基数排序(Radix Sort)
- 链表的插入和删除
- Android 简单的Logger 日志系统实现
- ubuntu中的vi不能正常使用
- count(*)和count(1)的区别
- 51单片机的某些错误解决
- [Sort]基数排序-两种实现
- UGUI摇杆
- hive中遇到的几个问题
- Java集合中ArrayList的实现原理
- 油菜花王国(并查集)
- Form(窗体)的FormBorderStyle属性的不同效果
- ajax异步提交 springMVC处理
- IP协议以及IP地址分类
- U-boot移植之RK-PX2开机启动打印信息