计数排序是可以以O(n)时间复杂度进行排序的最佳排序算法之一,但是计数排序的缺点是它的空间复杂性,对于少量的值集合,它还将需要大量未使用的空间。
因此,我们需要两件事来克服这一问题:
- 一种数据结构,仅占输入元素的空间,而不占除输入之外的所有其他元素的空间。
- 存储的元素必须按排序顺序,因为如果未排序,则存储它们将毫无用处。
因此,C++中的Map满足了这两个条件。因此,我们可以通过地图实现这一目标。
例子:
Input: arr[] = {1, 4, 3, 5, 1}
Output: 1 1 3 4 5
Input: arr[] = {1, -1, -3, 8, -3}
Output: -3 -3 -1 1 8
以下是在C++中使用map进行计数排序的实现:
// C++ implementation of the approach
#include
using namespace std;
// Function to sort the array using counting sort
void countingSort(vector arr, int n)
{
// Map to store the frequency
// of the array elements
map freqMap;
for (auto i = arr.begin(); i != arr.end(); i++) {
freqMap[*i]++;
}
int i = 0;
// For every element of the map
for (auto it : freqMap) {
// Value of the element
int val = it.first;
// Its frequency
int freq = it.second;
for (int j = 0; j < freq; j++)
arr[i++] = val;
}
// Print the sorted array
for (auto i = arr.begin(); i != arr.end(); i++) {
cout << *i << " ";
}
}
// Driver code
int main()
{
vector arr = { 1, 4, 3, 5, 1 };
int n = arr.size();
countingSort(arr, n);
return 0;
}
输出:
1 1 3 4 5