Site icon Study Algorithms

Counting Sort

Counting sort is not a comparison sort algorithm. The sorting techniques that work on comparison are:

The best time complexity you can achieve in any of these sorting techniques is O(n * \log(n)). However, is some very specific cases, you can achieve an even faster computation time of O(n). This is made possible by an assumption. We assume that the input data set is within a finite limit.

For example, if you want to sort some characters of the English alphabet. You know that there can be a maximum of 26 characters. Similarly, if you are trying to sort marks of some students, and you know that they can range only between 0-100. These are the cases where Counting Sort can come in very handy.

Basic Idea:

The basic idea of counting sort is to determine, for each input element X, the number of elements smaller than X. This information can be used to place the element directly into its correct position in the resultant sorted array. For example, if there are 10 elements less than X, then X would belong at position 11 in the output array.

In the below example, arr[0..n – 1] is the input array with length n. In counting sort we need two more arrays: let us assume array count[0..n – 1] as another array and out[0..n – 1] as the final sorted array.

Fig: Input array with minimum as 0 and max as 5
Fig: Count array with frequency of each element
Fig: Count array with cumulative sums
Fig: Final sorted array

Implementation and Code:

Here is an implementation of the algorithm:-

static void countingSort(int[] arr)
{
  int max = Arrays.stream(arr).max().getAsInt();
  int min = Arrays.stream(arr).min().getAsInt();
  int range = max - min + 1;

  // Auxiliary array to store counts of each element
  int[] count = new int[range];

  // Auxiliary array to store the resultant sorted array
  int[] output = new int[arr.length];

  // Store count of each element
  for (int j : arr) {
    count[j - min]++;
  }

  // Change count[i] so that count[i] now contains actual
  // position of this character in output array
  for (int i = 1; i < count.length; i++) {
    count[i] += count[i - 1];
  }

  // Build the output array
  // To make it stable we are operating in reverse order.
  for (int i = arr.length - 1; i >= 0; i--) {
    output[count[arr[i] - min] - 1] = arr[i];
    count[arr[i] - min]--;
  }

  System.arraycopy(output, 0, arr, 0, arr.length);
}
Code language: Java (java)

Time Complexity: O(n)
Space Complexity: O(n + k) where k is the range of the elements.

You can also find the sample code along with test cases on GitHub.

Video Explanation:

Exit mobile version