Counting sort

Written by Ben Wendt

I have a thing for sorting algorithms. They’re fairly accessible as far as algorithms go, and it’s always fun to look under the hood of how computers go about their business. Thinking algorithmically makes you a better programmer too.

So I was interested to see this post on hacker news about count sort in C, and decided to implement it in languages more within my milieu.

PHP

function count_sort($in) {
    $counting = array_fill(0, max($in), 0);

    for ($i = 0, $l = count($in); $i < $l; $i++) {
        $counting[$in[$i] - 1]++;
    }
    for ($i = 0, $j = 0, $l = count($counting); $i < $l; $i++) {
        while ($counting[$i] > 0) {
            $in[$j] = $i + 1;
            $counting[$i]--;
            $j++;
        }
    }

    return $in;
}

Javascript

function count_sort(a) {
    var i, j, l = Math.max.apply(null, a), counting = [];    
    for (i = 0; i < l; i++) {
        counting[i] = 0;
    }
    l = a.length;

    for (i = 0; i < l; i++) {
        counting[a[i] - 1]++;
    }
    for (i = 0, j = 0, l = counting.length; i < l; i++) {
        while (counting[i] > 0) {
            a[j] = i + 1;
            counting[i]--;
            j++;
        }
    }

    return a;
}

python

    def countsort(a):
    counts = [0] * max(a)
    l = len(a) 
    for i in range(0, l):
        counts[a[i] - 1] += 1
    j = 0
    l = len(counts)
    for i in range(0, l):
        while counts[i] > 0:
            a[j] = i + 1
            counts[i] -= 1
            j += 1
    return a

c

static int[] countSort(int[] a) {
            int i, j, l = a.Count();
            int[] counting = new int[a.Max()];    
            for (i = 0; i < l; i++) {
                counting[i] = 0;
            }

            for (i = 0; i < l; i++) {
                counting[a[i] - 1]++;
            }
            for (i = 0, j = 0, l = counting.Count(); i < l; i++) {
                while (counting[i] > 0) {
                    a[j] = i + 1;
                    counting[i]--;
                    j++;
                }
            }

            return a;
        }

powershell

Function countSort ($in) {
    $l = $in | Measure -Maximum
    $l = $l.Maximum
    $counting = @()

    for ($i = 0; $i -lt $l; $i++) {
        $counting += 0;
    }

    $l = $in.length

    for ($i = 0; $i -lt $l; $i++) {
        $counting[$in[$i] - 1]++;
    }

    $l = $counting.length
    $j = 0

    for ($i = 0; $i -lt $l; $i++) {
        while ($counting[$i] -gt 0) {
            $in[$j] = $i + 1;
            $counting[$i]--;
            $j++;
        }
    }

    return $in;

}

Conclusion

The sort only works with positive integers.

As it mentions in the blog I linked that inspired this column, the time and space of the algorithm are O(n + k), where k is the maximum element size in the array. That’s the real problem with the algorithm. If you sort something like [1, 3, 5, 1287614], you end up with a count array of 1287614 elements, which is definitely excessive for the array being sorted. Sorting an array shouldn’t fail because the elements in the array are too big. Running the PHP sort in a standard configuration with 5000000 in the input array will cause an out of memory exception.