Sorting Algorithm 11: Counting Sort 

In this chapter we shall learn about below topics:
11.1 Definition
11.2 Steps for performing Counting Sort
11.3 Understanding Counting Sort with an example
11.4 Implementation of Counting Sort in C
11.5 Output of the program
11.6  Time complexity analysis of Counting Sort

11.1 Definition

Counting sort algorithm is a linear sort algorithm. This algorithm is not based on comparing the elements but rather counting of the elements.

11.2 Steps for performing Counting Sort

Usually we use this algorithm with other algorithm for example radix sort algorithm.
Below are the steps how the algorithm works:
Step 1: Find the minimum and maximum value from the array.
Step 2: Create a second array from the minimum value to maximum value.
Step 3: Increment the second array whenever we find a number from the first array.
Step 4: Once all the numbers will be written, take the sum [see in the pic below].
Step 5: Place the elements in the respective positions. You will get the sorted array.

11.3 Understanding Counting Sort with an example

Consider the below array, we shall sort this array using counting sort algorithm.
Counting_sort
From the image above, we know that 4 is the smallest element and 15 is the largest element.
Now create one more array to hold the elements from index 4 to 15 and also counting array to hold the count as shown below:
Counting_sort
Now, count the number of times each element is repeated. Al the elements are repeated only once. Hence write 1 in their respective index as shown below;
Counting_sort
write 0, in all the index which are empty.
Counting_sort
Now create a sum count array that will hold the sum of counts for the given index. Initially it will be as below:
Counting_sort
Now add the index and write down the sum count as shown below:
Counting_sort
Now we shave filled out sum count array, let’s sort the input with the help of counting sort.
Create an output array. Initially the output array will be as below:
Counting_sort
Now, check the element from input array and get the value from sumCount array and place it at its index.
For example,
First element is 14.
The value for 14 in sumCount array is 6. Hence place 14 in index 6 in output array.
Counting_sort
For 5, the value of 5 in sumCount array is 2. Hence place 5 in index 2.
Counting_sort
Similarly, do for all the elements we get sorted output as below:
Counting_sort

11.4 Implementation of Counting Sort in C


#include<stdio.h>
#include<string.h>

void print_array(int array[], int length)
{
	int index = 0;

	printf("The sorted array is \n");

	for(index = 0 ; index < length ; index++)
	{
		printf("%d\n",array[index] );
	}
}


void counting_sort (int array[], int length)
{


	int max_number = array[0];
	int min_number = array[0];

	int i = 0;

	// find maximum and minimum number
	for ( i = 0; i < length; ++i)
	{
		if (array[i] > max_number)
			max_number = array[i];

		if (array[i] < min_number)
			min_number = array[i];
	}

    int range = max_number - min_number + 1;

	int counting_array [range];
	memset(counting_array, 0, sizeof(counting_array));


	// initialize the occurance of each element in counting array
	for ( i = 0; i < length; ++i)
	{
		counting_array[array[i] - min_number]++;
	}

	// calculate the sum of indexes
	int j = 0;
	for (int i = 1; i < range; i++)
	{
		counting_array[i] += counting_array[i - 1];
	}

	for (int i = 0; i < range; i++)
	{
		while( j < counting_array[i])
			array[j++] = i + min_number;
	}
	
}

int main()
{
	int length = 0;
	int array[100];
	int index = 0;

	printf("Enter the length of the array\n");
	scanf("%d", &length);

	printf("Enter the array elements of length %d\n", length);

	for (index = 0; index < length; ++index)
	{
		scanf("%d", &array[index]);
	}

	counting_sort(array, length);

	print_array(array, length);


}

11.5 Output of the program

Enter the length of the array
4
Enter the array elements of length 4
4
3
2
1
The sorted array is
1
2
3
4

11.6   Time complexity analysis of Counting Sort

Time complexity is O( n+r).
Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *