基数排序和我们前面学的计数排序一样都是非比较型整数排序,它的基本思想是把整数分成个、百、千等位数分别进行比较。基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
思路:
1、求出序列中最大数的位数MaxDigit,它决定我们等一下要排几轮
2、创建数组count对序列的每组位数进行计数,再累加求得对应序列数每轮排序后的位置
3、把排序后的数按对应位置放入数组output
4、把output拷贝回原数组a,然后进行下一轮排序
代码如下:
void PrintArray(int* a, int n)//把数组中的元素打印出来
{
for (int i = 0; i < n; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
void LSDSort(int* a, int place, int n)
{
int count[10] = { 0 };
int* output = (int*)malloc(sizeof(int) * n);
//对比较的位进行计数
for (int i = 0; i < n; i++)
{
count[(a[i] / place) % 10]++;
}
//累加求得对应序列数每轮排序后的位置
for (int i = 1; i < 10; i++)
{
count[i] += count[i - 1];
}
//把排序后的数按对应位置放入数组output
for (int i = n - 1; i >= 0; i--)
{
output[count[(a[i] / place) % 10] - 1] = a[i];
count[(a[i] / place) % 10]--;
}
//拷贝
for (int i = 0; i < n; i++)
{
a[i] = output[i];
}
}
int GetMaxDigit(int* a, int n)
{
int max = a[0], digit = 1;
for (int i = 0; i < n; i++)
{
if (a[i] > max)
max = a[i];
}
while (max /= 10)
{
digit++;
}
return digit;
}
void RadixSort(int* a, int n)
{
int MaxDigit = GetMaxDigit(a,n);//最大数的位数
int place = 1;
for (int i = 0; i < MaxDigit; i++)
{
LSDSort(a, place, n);
place *= 10;
}
}
void TestRadixSort()
{
int a[] = { 44,756,12,9,18,21,11,53,89 };
RadixSort(a, sizeof(a) / sizeof(int));
PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{
TestRadixSort();
return 0;
}