#include<iostream>
using namespace std;
int get_digit_num(int data)
{
int size=0;
while (data)
{
size++;
data = data / 10;
}
return size;
}
int get_digit(int data, int size)
{
int tmp;
tmp= data;
while (size)
{
tmp = tmp / 10;
size--;
}
return (tmp % 10);
}
void radix_sort(int *datas, int len, int size)
{
int i, j, k;
int *num = (int*)malloc(len * sizeof(int));
int *counts = (int*)malloc(len * sizeof(int));
int *save = (int*)malloc(len * sizeof(int));
//memset(temps, 0, 10 * sizeof(int));
//memset(tmpd, -1, 10 * sizeof(int));
//memset(rets, -1, 10 * sizeof(int));
for (i = 0; i < size; i++)
{
memset(num, 0, len * sizeof(int));
memset(counts, 0, len * sizeof(int));
memset(save, 0, len * sizeof(int));
for (j = 0; j < len; j++)
num[j] = get_digit(datas[j], i);
for (j = 0; j < len; j++)
counts[num[j]] = counts[num[j]] + 1;
for (k = 1; k < 10; k++)
counts[k] = counts[k] + counts[k - 1];
for (j = len - 1; j >= 0; j--)
{
save[counts[num[j]] - 1] = datas[j];
counts[num[j]] = counts[num[j]] - 1;
}
memcpy(datas, save, sizeof(int)*len);
}
free(num);
free(counts);
free(save);
}
int max(int *datas, size_t length)
{
int k = datas[0];
int i;
for (i = 1; i<length; ++i)
if (datas[i] > k)aaa
k = datas[i];
return k;
}
int main()
{
int i;
int datas[] = { 1, 11, 99, 55, 432, 578, 256, 782, 691, 206, 942, 387, 696, 374, 123, 55556, 888888888 };
int len = sizeof(datas) / sizeof(int);
int k = max(datas, len);
int size = get_digit_num(k);
radix_sort(datas, len, size);
printf("After radix sort the result is:\n");
for (i = 0; i<len; i++)
printf("%d ", datas[i]);
exit(0);
}