#include<iostream>
using namespace std;
int getRadixValue(int value, int radix, int radixCount)
{
int radixValue = value;
int i;
for(i = 0; i < radixCount; ++i)
{
radixValue=radixValue/radix;
}
radixValue = radixValue % radix;
return radixValue;
}
bool radixSort(int array[],int arrLen,int radix)
{
int max = array[0];
int radixIndex;
int j,k,l,m,n;
if(arrLen <= 1)
return true;
for(int i = 1; i < arrLen; ++i)
if (max < array[i]) max = array[i];
int radixCount = 1;
while ((max/=radix) > 0)
{
++radixCount;
}
int *countingRadixBuckets = new int[radix]();
int *tempArray = new int[arrLen]();
for (radixIndex = 0; radixIndex < radixCount; ++radixIndex)
{
for(j = 0; j < arrLen; ++j)
{
++countingRadixBuckets[getRadixValue(array[j], radix, radixIndex)];
}
for(k = 1; k < radix; ++k)
{
countingRadixBuckets[k] += countingRadixBuckets[k-1];
}
for(l = arrLen - 1; l >= 0; --l)
{
tempArray[--countingRadixBuckets[getRadixValue(array[l], radix, radixIndex)]] = array[l];
}
for(m = 0; m < arrLen; ++m)
{
array[m] = tempArray[m];
}
for(n = 0; n < radix; ++n)
{
countingRadixBuckets[n] = 0;
}
}
delete [] countingRadixBuckets;
delete [] tempArray;
return true;
}
void printArray(int array[], int arrLen)
{
for (int i = 0; i < arrLen; ++i)
{
cout<<array[i] << " ";
}
cout<<endl<<endl;
}
int main()
{
int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
int arrayLen = sizeof(a)/sizeof(int);
cout<<"待排序数据为:";
printArray(a,arrayLen);
radixSort(a, arrayLen, 10);
cout<<"排完序后的数据:";
printArray(a, arrayLen);
}