// C++ implementation of Radix Sort
#include <iostream>

using namespace std;

int Max_Element(int array[], int size)
{
    int max = array[0];

    for(int i = 1; i < size; i++)
        if(array[i] > max)
            max = array[i];

    return max;
}

void Counting_Sort(int array[], int size, int exp)
{
    int output[size];
    int i, count[10] = {0};

    for(i = 0; i < size; i++)
        count[(array[i] / exp) % 10]++;

    for(i = 1; i < 10; i++)
        count[i] += count[i - 1];

    for(i = size - 1; i >= 0; i--)
    {
        output[count[(array[i] / exp) % 10] - 1] = array[i];
        count[(array[i] / exp) % 10]--;
    }

    for(i = 0; i < size; i++)
        array[i] = output[i];
}

void Radix_Sort(int array[], int size)
{
    int max = Max_Element(array, size);

    for(int exp = 1; max / exp > 0; exp *= 10)
        Counting_Sort(array, size, exp);
}

void Print_Array(int array[], int size)
{
    for(int i = 0; i < size; i++)
        cout << array[i] << " ";

    cout << endl;
}

int main()
{
    int array[] = {170, 45, 75, 90, 802, 24, 2, 66};
    int size = 8;

    Radix_Sort(array, size);

    Print_Array(array, size);

    return 0;
}


/* Output

2 24 45 66 75 90 170 802

*/