标签:分配 实现 收集 相同 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