标签:分配 实现 收集 相同 col pac www. stream 扫描
#include<iostream> #include<cstdlib> using namespace std; int getdigit(int x,int d) { int a[]={ 1,1,10 };//因为待排序数组最大是两位数,所以到十位就好 return ((x/a[d])%10);//确定桶号 } void PrintArr(int ar[],int n) { for(int i=0;i<n;i++) cout<<ar[i]<<" "; cout<<endl; } void msdradix_sort(int arr[],int begin,int end,int d) { const int radix=10; int count[radix],i,j; //置空 for(i=0;i<radix;++i) { count[i]=0; } //分配桶储存空间 int *bucket=(int *)malloc((end-begin+1)*sizeof(int)); //统计各桶需要装的元素数 for(i=begin;i<=end;++i) { count[getdigit(arr[i],d)]++; } //求出桶的便捷索引,count[i]值为第i个桶的右边界索引+1 for(i=01;i<radix;++i) { count[i]=count[i]+count[i-1]; } //这里要从右向左扫描,保证排序的稳定性 for(i=end;i>=begin;--i) { j=getdigit(arr[i],d);//求出关键码的第d位数字,如576的第三位是5 bucket[count[j]-1]=arr[i];//放入对应的桶中,count[j]-1是第j个桶的右边界索引 --count[j]; } //此时count[i]为第i个桶的左边界 //从每个桶中收集数据 for(i=begin,j=0;i<=end;++i,++j) { arr[i]=bucket[j]; } //释放储存空间 free(bucket); //对每个桶中数据进行再排序 for(i=0;i<radix;i++) { int p1=begin+count[i];//第i个桶的左边界 int p2=begin+count[i+1]-1;//第i个桶的有边界 if(p1<p2&&d>1) { msdradix_sort(arr,p1,p2,d-1);//对第i个桶递归调用,进行基数排序,数位降1 } } } int main() { int ar[]={ 12,24,54,23,54,76,97,45,23,65,87,34, }; int len=sizeof(ar)/sizeof(int); cout<<"排序前数据如下"<<endl; PrintArr(ar,len); msdradix_sort(ar,0,len-1,2); cout<<"排序后结果如下:"<<endl; PrintArr(ar,len); }
最高位优先法通常是一个递归的过程:
<1>先根据最高位关键码K1排序,得到若干对象组,对象组中每个对象都有相同关键码K1。
<2>再分别对每组中对象根据关键码K2进行排序,按K2值的不同,再分成若干个更小的子组,每个子组中的对象具有相同的K1和K2值。
<3>依此重复,直到对关键码Kd完成排序为止。
<4> 最后,把所有子组中的对象依次连接起来,就得到一个有序的对象序列。
from[http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html]
标签:分配 实现 收集 相同 col pac www. stream 扫描
原文地址:http://www.cnblogs.com/enyala/p/7700880.html