📜  在C++中使用地图实现计数排序

📅  最后修改于: 2021-05-06 19:16:46             🧑  作者: Mango

计数排序是可以以O(n)时间复杂度进行排序的最佳排序算法之一,但是计数排序的缺点是它的空间复杂性,对于少量的值集合,它还将需要大量未使用的空间。

因此,我们需要两件事来克服这一问题:

  1. 一种数据结构,仅占输入元素的空间,而不占除输入之外的所有其他元素的空间。
  2. 存储的元素必须按排序顺序,因为如果未排序,则存储它们将毫无用处。

因此,C++中的Map满足了这两个条件。因此,我们可以通过地图实现这一目标。

例子:

以下是在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