#include <stdio.h>
const int pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
#define get_digit(num, n) ((num) % pow10[(n)] / pow10[(n) - 1])
int counting_sort(const int arr[], int size, int target[], int n) {
int count[10] = {0};
for (int i = 0; i < size; ++i) {
count[get_digit(arr[i], n)]++;
}
if (count[0] == size) {
return 0;
}
for (int i = 1; i < 10; ++i) {
count[i] += count[i - 1];
}
for (int i = size - 1; i >= 0; --i) {
target[count[get_digit(arr[i], n)] - 1] = arr[i];
count[get_digit(arr[i], n)]--;
}
return 1;
}
void radix_sort(int arr[], int size) {
int another[size], state = 1, i;
for (i = 1; state > 0 && i <= 10; ++i) {
if (i % 2 > 0) {
state = counting_sort(arr, size, another, i);
} else {
state = counting_sort(another, size, arr, i);
}
}
if (i % 2 > 0 && i <= 10) {
for (int j = 0; j < size; ++j) {
arr[j] = another[j];
}
}
}
int main() {
int arr[] = {329, 457, 657, 839, 436, 720, 355}, size = sizeof(arr) / sizeof(int);
radix_sort(arr, size);
for (int i = 0; i < size; ++i) {
printf("%d\n", arr[i]);
}
return 0;
}