Counting sort is a sorting algorithm that sorts the elements of an array by counting the frequency of each distinct element in the array.
The frequencies are stored in a frequency array. Sorting is done by calculating the position of elements from the index values of frequency array.
Input array: 12 2 3 4 2 3 6 8 4 5 Range of input array is 0 ~12 (min is 0 and max is 12) Create a frequency array (size = max +1) Frequency array: 0 0 2 2 2 1 1 0 1 0 0 0 1 Scan the frequency array from beginning and output the index values frequency times Sorted array: 2 2 3 3 4 4 5 6 8 12
Analysis:
Time complexity: O (n +k)
Space complexity: O (k)
where k the range of values and n is the number of values in the input array
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void counting_sort(vector<int>& v) {
// find the max value so that freq array can be created
auto max_val = max_element(begin(v), end(v));
vector<int> freq(*max_val + 1);
// find frequency
for (int i = 0; i < v.size(); i++)
freq[v[i]]++;
// output sorted values from frequency table
int k = 0;
for (int i = 0; i < freq.size(); i++) {
if (freq[i] > 0) {
for (int j = 0; j < freq[i]; j++)
v[k++] = i;
}
}
}
int main() {
vector<int> v = {2, 3, 4, 2, 3, 6, 8, 4, 5};
counting_sort(v);
for (auto val : v)
cout << val << " ";
cout << endl;
return 0;
}2 2 3 3 4 4 5 6 8
References