不基于比较的排序,若存在负数则全体加上最小值排序后全体减去最小值
#include <iostream>
using namespace std;
int getD(int num, int d) //获取d位上的数
{
while (d > 1)
{
d--;
num /= 10;
}
return num % 10;
}
int getDigit(int num) //获取最大位数 低于最大位则补前缀0
{ //如:123 7 -> 123 007
int d = 0;
while (num)
{
d++;
num /= 10;
}
return d;
}
int getMax(int* arr,int length) //数组最大值
{
int my_max = 0;
for (int i = 0; i < length; i++)
{
my_max = max(arr[i], my_max);
}
return my_max;
}
void radixsort(int* arr, int length, int digit)
{
int radix = 10;
int* count = new int[radix]; //记录d位上的数进行出桶入桶
int* help = new int[length]; //桶
for (int d = 1; d <= digit; d++)
{
memset(count, 0, radix * 4); //初始化
for (int i = 0; i < length; i++)
{
int j = getD(arr[i], d);
count[j]++;
}
for (int i = 1; i < radix; i++) //记录>=d位的数量
{
count[i] = count[i] + count[i - 1];
}
for (int i = length - 1; i >= 0; i--) //入桶
{
int j = getD(arr[i], d);
help[count[j] - 1] = arr[i];
count[j]--;
}
for (int i = 0; i < length; i++) //出桶
{
arr[i] = help[i];
}
}
}
int main(void)
{
int arr[] = { 56,431,8,96,123,46,73,1 };
int length = sizeof(arr) / sizeof(arr[0]);
int my_max = getMax(arr, length);
radixsort(arr, length, getDigit(my_max));
for (int i = 0; i < length; i++)
{
cout << arr[i] << ' ';
}
return 0;
}
输出:
1 8 46 56 73 96 123 431