1、基本原理。
见下图。
2、实现。
/**
* @brief getArrayMaxWidth 辅助函数,找出一组数中最大的数的位数
* @param array 数组首地址
* @param length 数组长度
* @return
*/
int getArrayMaxWidth(int* array,int length)
{
//1、找到最大元素
int maxEle=array[0];
for(int i=1;i<length;++i)
{
if(maxEle<array[i])
maxEle=array[i];
}
//2、解出宽度
int width=0;
int Quotient=maxEle;
while(Quotient!=0)
{
Quotient=Quotient/10;
width++;
}
return width;
}
//找出value第index位的值
//index从0开始
int getValueOfSpeficIndex(int value,int index)
{
//获取数据位数
int width=getArrayMaxWidth(&value,0);
if(width<index)
return 0;
else {
int result=value;
int finalRes=result;
while(index-->=0)
{ finalRes=result%10;
result=result/10;
}
return finalRes;
}
}
//对数组的第index位进行一轮排序,index从0开始,表示从左向右第一位
void sortSpeficIndex(int* array,int arrayLength,int index)
{
struct Node
{
int value_;
Node* next_;
Node(int value):
value_(value),
next_(nullptr)
{
}
};
Node* bucketArray[10];
Node* bucketItemHead[10];
for(int i=0;i<10;++i)
{
bucketArray[i]=nullptr;
bucketItemHead[i]=nullptr;
}
for(int i=0;i<arrayLength;++i)
{
Node* tempNode=new Node(array[i]);
if(bucketArray[getValueOfSpeficIndex(array[i],index)]==nullptr)
{
bucketArray[getValueOfSpeficIndex(array[i],index)]=tempNode;
bucketItemHead[getValueOfSpeficIndex(array[i],index)]=tempNode;
}
else
{
bucketItemHead[getValueOfSpeficIndex(array[i],index)]->next_=tempNode;
bucketItemHead[getValueOfSpeficIndex(array[i],index)]=
bucketItemHead[getValueOfSpeficIndex(array[i],index)]->next_;
}
}
Node* curBucketList=nullptr;
int arrayIndex=0;
for(int i=0;i<10;++i)
{
curBucketList=bucketArray[i];
while(curBucketList!=nullptr)
{
array[arrayIndex++]=curBucketList->value_;
curBucketList=curBucketList->next_;
}
}
Node* toBeDeleted=nullptr;
for(int i=0;i<10;++i)
{
curBucketList=bucketArray[i];
while(curBucketList!=nullptr)
{
toBeDeleted=curBucketList->next_;
delete curBucketList;
curBucketList=toBeDeleted;
}
}
}
void radixSort(int* array,int length)
{
int width=getArrayMaxWidth(array,length);
for(int i=0;i<width;++i)
sortSpeficIndex(array,length,i);
}
bool compare(int a,int b)
{
return a<b?true:false;
}
//测试函数
int main()
{
int a[10]={11,42,53,25,36,6,75,8,26,345};
std::cout<<"before sort:"<<std::endl;
for(int i=0;i<10;++i)
std::cout<<a[i]<<"\t";
std::cout<<std::endl;
radixSort(a,10);
std::cout<<"after sort:"<<std::endl;
for(int i=0;i<10;++i)
std::cout<<a[i]<<"\t";
std::cout<<std::endl;
return 0;
}
3、运行截图。
参考:
[1].https://mp.weixin.qq.com/s/N2QFcXATspbDcLv1zIisTg