Counting Sort is a non-comparison-based sorting algorithm. It is particularly efficient when the range of input values is small compared to the number of elements to be sorted.
We could simply count occurrences of all elements and one by one put them in the output array, but we computer prefix sums to achieve stability in the algorithm. Note that, after building the prefix sum cntArr[], we traverse the array from right end to ensure that the last occurrence moves to the last correct position in the sorted array.
#include<iostream>
#include<vector>
usingnamespacestd;
vector<int>countsort(vector<int>&arr){
intn=arr.size();
// find the maximum element
intmaxval=0;
for(inti=0;i<n;i++)
maxval=max(maxval,arr[i]);
// create and initialize cntArr array
vector<int>cntArr(maxval+1,0);
// count frequency of each element
for(inti=0;i<n;i++)
cntArr[arr[i]]++;
// compute prefix sum
for(inti=1;i<=maxval;i++)
cntArr[i]+=cntArr[i-1];
// build output array
vector<int>ans(n);
for(inti=n-1;i>=0;i--){
ans[cntArr[arr[i]]-1]=arr[i];
cntArr[arr[i]]--;
}
returnans;
}
intmain(){
vector<int>arr={2,5,3,0,2,3,0,3};
vector<int>ans=countsort(arr);
for(intx:ans)
cout<<x<<" ";
return0;
}
#include<stdio.h>
#include<stdlib.h>
voidcountsort(intarr[],intn){
intmaxval=0;
// Find the maximum element
for(inti=0;i<n;i++){
if(arr[i]>maxval){
maxval=arr[i];
}
}
// Create and initialize cntArr array
int*cntArr=(int*)calloc(maxval+1,sizeof(int));
// Count frequency of each element
for(inti=0;i<n;i++){
cntArr[arr[i]]++;
}
// Compute prefix sum
for(inti=1;i<=maxval;i++){
cntArr[i]+=cntArr[i-1];
}
// Build output array
int*ans=(int*)malloc(n*sizeof(int));
for(inti=n-1;i>=0;i--){
ans[cntArr[arr[i]]-1]=arr[i];
cntArr[arr[i]]--;
}
// Copy sorted elements back to arr[]
for(inti=0;i<n;i++){
arr[i]=ans[i];
}
// Free dynamically allocated memory
free(cntArr);
free(ans);
}
// Driver code
intmain(){
intarr[]={2,5,3,0,2,3,0,3};
intn=sizeof(arr)/sizeof(arr[0]);
// Sorting the array
countsort(arr,n);
// Printing the sorted array
for(inti=0;i<n;i++){
printf("%d ",arr[i]);
}
return0;
}
importjava.util.Arrays;
publicclass CountingSort{
publicstaticint[]countSort(int[]arr){
intn=arr.length;
if(n==0){
returnnewint[0];
}
// find the maximum element
intmaxVal=arr[0];
for(inti=1;i<n;i++){
if(arr[i]>maxVal){
maxVal=arr[i];
}
}
// create and initialize cntArr array
int[]cntArr=newint[maxVal+1];
for(inti=0;i<=maxVal;i++){
cntArr[i]=0;
}
// count frequency of each element
for(inti=0;i<n;i++){
cntArr[arr[i]]++;
}
// compute prefix sum
for(inti=1;i<=maxVal;i++){
cntArr[i]+=cntArr[i-1];
}
// build output array
int[]ans=newint[n];
for(inti=n-1;i>=0;i--){
intv=arr[i];
ans[cntArr[v]-1]=v;
cntArr[v]--;
}
returnans;
}
publicstaticvoidmain(String[]args){
int[]arr={2,5,3,0,2,3,0,3};
int[]ans=countSort(arr);
System.out.println(Arrays.toString(ans));
}
}
def count_sort(arr):
if not arr:
return []
n = len(arr)
maxval = max(arr)
# create and initialize cntArr
cntArr = [0] * (maxval + 1)
# count frequency of each element
for v in arr:
cntArr[v] += 1
# compute prefix sums
for i in range(1, maxval + 1):
cntArr[i] += cntArr[i - 1]
# build output array
ans = [0] * n
# iterate in reverse to keep it stable
for i in range(n - 1, -1, -1):
v = arr[i]
ans[cntArr[v] - 1] = v
cntArr[v] -= 1
return ans
if __name__ == "__main__":
arr = [2, 5, 3, 0, 2, 3, 0, 3]
ans = count_sort(arr)
print(ans)
usingSystem;
classCountingSort
{
publicstaticint[]CountSort(int[]arr)
{
intn=arr.Length;
if(n==0)
{
returnnewint[0];
}
// find maximum
intmaxVal=arr[0];
foreach(intvinarr)
{
if(v>maxVal)
maxVal=v;
}
// create and initialize cntArr
int[]cntArr=newint[maxVal+1];
for(inti=0;i<=maxVal;i++)
{
cntArr[i]=0;
}
// count frequency
foreach(intvinarr)
{
cntArr[v]++;
}
// prefix sums
for(inti=1;i<=maxVal;i++)
{
cntArr[i]+=cntArr[i-1];
}
// build output
int[]ans=newint[n];
for(inti=n-1;i>=0;i--)
{
intv=arr[i];
ans[cntArr[v]-1]=v;
cntArr[v]--;
}
returnans;
}
staticvoidMain(string[]args)
{
int[]arr={2,5,3,0,2,3,0,3};
int[]ans=CountSort(arr);
Console.WriteLine(string.Join(", ",ans));
}
}
functioncountSort(arr){
if(arr.length===0){
return[];
}
constn=arr.length;
constmaxVal=Math.max(...arr);
// create and initialize cntArr
constcntArr=newArray(maxVal+1).fill(0);
// count frequency of each element
for(letvofarr){
cntArr[v]++;
}
// compute prefix sums
for(leti=1;i<=maxVal;i++){
cntArr[i]+=cntArr[i-1];
}
// build output array
constans=newArray(n);
for(leti=n-1;i>=0;i--){
constv=arr[i];
ans[cntArr[v]-1]=v;
cntArr[v]--;
}
returnans;
}
// Example usage:
constarr=[2,5,3,0,2,3,0,3];
constans=countSort(arr);
console.log(ans);// [0, 0, 2, 2, 3, 3, 3, 5]
0 0 2 2 3 3 3 5