LSD:从低位排序逐步至高位排序,此处的低位指的是从个位->十位->百位….
代码如下:
//获取数据d位的值
int getDigit(int x,int d)
{
int value = 1 ;
for(int i = 0 ;i <d-1;++i)
value *= 10 ;
return (x/value)%10;
}
//LSD 算法
void lsdRadixSort(int *arr,int begin,int high,int d)
{
int i,j ;
const int radix = 10 ;
int count[radix] ={0} ;
int *bucket = (int*)malloc(end-begin+1)*sizeof(int));
for(int k = 1;k<=d;++k)
{
//计算每个桶中的元素个数
for(i = begin;i<=end;++i)
++count[getDigit(arr[i],d)] ;
//
for(i = 1;i<radix;++i)
count[i]+=count[i-1];
//装入元素
for(i = end;i>=begin;--i)
{
j = getDigit(arr[i],d);
bucket[count[j]-1] = arr[i] ;
--count[j];
}
//将d位排序完的数据拷贝至arr中
for(i = begin,j=0;i<=end;++i,++j)
arr[i] = bucket[j] ;
}
}
//MSD算法 从高位排序至低位排序
void msdRadixSort(int *arr,int begin,int end,int d)
{
const int radix = 10 ;
int i,j ;
int *bucket = (int*)malloc((end-begin+1)*sizeof(int));
//求出d位中各个桶的元素个数,即分段d位分别为0-9的个数
for(i = begin;i<=end;++i)
{
++count[getDigit(arr[i],d)];
}
//求出各个桶的边界索引0-9中每一个段的元素个数
for(i = 1;i<radix;++i)
count[i] += count[i-1] ;
//装入桶中
for(i = end;i>=begin;--i)
{
j = getDigit(arr[i],d) ;
bucket[count[j]-1] = arr[i] ;
--count[j];
}
//从桶中收集数据
for(i= begin,j = 0 ;i<=end;++i,++j)
arr[i] = bucket[j] ;
for(i = 0 ;i<radix;++i)
{
int low = begin + count[i] ;
int high = begin + count[i+1];
if(low < high && d>1)
msdRadix(arr,low,high);
}