本文以最大为3位数字为例,并可以对负数进行排序
#include<iostream>
using namespace std;
//获取第d+1位的数字//
int get_digit(int x,int d)
{
int a[] = {1, 10, 100};
return (abs(x) / a[d]) % 10;
}
void lsd_sort(int arr[],int left, int right, int d)
{
if(left >= right) return;
const int radix = 10;
int count[radix], i, j;
//
int bucket[10] = {0};
//按照分配标准依次进行排序过程
for(int k = 0; k < d; ++ k)
{
memset(count, 0, radix * sizeof(int));
//统计各个桶中所盛数据个数
for(i = left; i < right + 1; i++)
{
count[get_digit(arr[i], k)]++;
}
//count[i]表示第i个桶的右边界索引
for(i = 1; i < radix; i++)
{
count[i] = count[i] + count[i-1];
}
//这里要从右向左扫描,保证排序稳定性
for(i = right; i > left - 1; --i)
{
j = get_digit(arr[i], k);
bucket[count[j]-1] = arr[i];
--count[j];
}
//一次桶排结束
for(i = left, j = 0; i < right+1; ++i, ++j)
{
arr[i] = bucket[j];
}
}
}
void main()
{
//int arr[10] = {200 8 190 389 -98 955 -888 124 516 -999};
int n;
cin >> n;
int *arr = new int[n];
for(int i = 0; i < n; ++i)
cin >> arr[i];
int gap = 0;//区分正负边界//
for(int i = 0; i < n; ++ i)
{
if(arr[i] < 0)
{
int temp = arr[gap];
arr[gap] = arr[i];
arr[i] = temp;
gap ++;
}
}
lsd_sort(arr, 0, gap - 1, 3);
int p = 0, q = gap - 1;
while(p < q)
{
int temp = arr[p];
arr[p] = arr[q];
arr[q] = temp;
p ++;
q --;
}
lsd_sort(arr, gap, n - 1, 3);
for(int i = 0; i < 10; ++ i)
cout << arr[i] << " ";
cout << endl;
delete[] arr;
system("pause");
}