Skip navigation

2015-07-07

Radix Sort

Java version of Radix Sort. Counting(bucket) sort by each digit. (decimal number). Same size (n) memory allocated as input size and memory copy each digit. It is very fast if the input data size is small.

package com.clustack;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class RadixSort {

    public static Integer[] sort(Integer[] arr, boolean desc) {
        int n = arr.length;

        int i;
        Integer maxValue = null;
        int exp = 1; // digit
        Integer[] tmp = new Integer[n];
        Integer[] hists = new Integer[10];

        while (true) {
            Arrays.fill(hists, 0);

            if (maxValue == null) { // for exit condition
                maxValue = arr[0];
                for (int ar : arr) {
                    if (ar > maxValue)
                        maxValue = ar;
                    hists[(ar / exp) % 10]++; // frequency distribution of digit 0..9
                }
            } else {
                for (int ar : arr)
                    hists[(ar / exp) % 10]++; // frequency distribution of digit 0..9
            }

            if (desc) {
                for (i = 9; i > 0; i--)
                    hists[i - 1] += hists[i]; // cumulative frequency distribution
            } else { // ascending order
                for (i = 1; i < 10; i++)
                    hists[i] += hists[i - 1]; // cumulative frequency distribution
            }
            for (i = n - 1; i >= 0; i--)
                tmp[--hists[(arr[i] / exp) % 10]] = arr[i];

            exp *= 10; // next digit
            if (maxValue / exp <= 0)
                return tmp;
            System.arraycopy(tmp, 0, arr, 0, n); // copy to results array
        }
    }

    public static void main(String[] args) {
        List<Integer> lists = new ArrayList<>();
        for (int i = 0; i < 100; i++)
            lists.add(i);
        Collections.shuffle(lists);
        System.out.println("Unsorted:" + lists);
        Integer[] results = RadixSort.sort(lists.toArray(new Integer[0]), false);
        System.out.println("Sorted(asc): " + Arrays.asList(results));

        System.out.println("\nUnsorted:" + lists);
        results = RadixSort.sort(lists.toArray(new Integer[0]), true);
        System.out.println("Sorted(desc): " + Arrays.asList(results));
    }
}