基数排序思路:

类似于快速转置的快速定位方法,利用上一个的开始位置和个数进行计算下一个的位置。

利用额外空间进行排序。



//基数排序
//LSD-- Least Significant Digit first
int GetMaxDigit(int* a, int size)
{
int Digit = 1;
int max = 10;
for (int i = 0; i < size; i++)
{
while (a[i]>max)
{
++Digit;
max *= 10;
}
}
return Digit;
}
void LSDSort(int* a, int size)
{
assert(a);
int count[10] = { 0 };
int start[10] = { 0 };
int radex = 1;
int maxDigit = GetMaxDigit(a, size);
int* bucket = new int[size];
for (int i = 0; i < maxDigit;i++)
{
memset(count, 0, sizeof(int)* 10); //每次重新排序的时候一定要初始化!!!
for (size_t i = 0; i < size; i++)
{
int num = (a[i] / radex) % 10;
count[num]++;
}
start[0] = 0;
for (size_t j = 1; j < 10; j++)
{
start[j] = start[j - 1] + count[j - 1];
}
for (size_t i = 0; i < size; ++i) //将数据按顺序放入bucket中
{
int num = (a[i] / radex) % 10;
bucket[start[num]++] = a[i];
}
radex *= 10;
memcpy(a, bucket, sizeof(int)* size);

}

delete[] bucket;
}
void TestLSDSort()
{
int array[] = { 10, 122, 1222, 10 ,19};
//int array[] = { 10, 11, 13, 12, 19, 16, 18, 15, 17, 14 };
LSDSort(array, sizeof(array) / sizeof(array[0]));
Print(array, sizeof(array) / sizeof(array[0]));
}