C++ 按频率排序元素

2024年8月28日 | 阅读 4 分钟

在 C++ 中对元素进行排序时,会计算每个元素的频率,然后用于确定元素的排序顺序。您可以通过使用诸如 std::sort 的排序算法以及诸如 std::map 和 std::unordered_map 的数据结构来完成这项工作。

  1. 用于频率计数的信息数据结构
    • std::map 和 std::unordered_map 统计元素的频率是这些数据结构的常见任务。您可以使用它们将项目存储为键,并将与之对应的频率存储为值。如果您不需要对元素进行排序,则应使用 std::unordered_map 而不是 std::map。std::unordered_map 在计数方面更快,但不保证元素已排序,而 std::map 确保元素已排序。
  2. 频率计数
    • 应遍历输入序列(例如向量或数组)。
    • 每次遇到元素时,更新地图上该元素的频率计数。如果元素不在地图中,则将其添加到地图中,频率计数为 1。如果元素已存在于地图中,则升级其频率计数。
  3. 转换为一对向量
    • 统计频率后,您必须根据这些频率对元素进行排序。
    • 使用地图的元素和频率创建一对向量。每对包含一个元素和与其关联的频率。您可以借助此功能使用算法对数据进行排序。
  4. 基于频率的排序
    • 使用排序方法(例如 std::sort)根据频率值对对向量进行排序。
    • 可以创建一个独特的比较函数,该函数根据频率值比较配对。在按降序(从高频率到低频率)对数据进行排序时,通常以相反方向比较频率值。
  5. 打印排序后的元素
    • 排序后,您可以重复遍历排序后的对向量,以按频率顺序获取元素。
    • 元素应按频率降序显示,每个元素根据其频率打印多次。
  6. 输出
    • 元素将根据其频率在输出中排列。排序过程的输出将首先显示频率较高的元素。
    • 使用地图来计数频率,然后将地图转换为一对向量。之后,按频率对向量进行排序,并打印排序后的项目。此方法有助于根据元素的出现频率对元素进行分类或分析数据集中组件的分布。

程序

让我们举一个例子来演示一个在 C++ 中**按频率排序元素**的程序

输出

Elements sorted by frequency:
3 3 2 2 1 8 4

说明

  1. 我们从一个输入元素向量开始,该向量包含将按频率排序的元素。
  2. 我们使用一个名为**frequencyMap**的**std::unordered_map**来确定输入向量中每个成员出现的频率。
  3. 每次我们循环遍历项目向量时,我们都会增加该元素的**frequencyMap**值的计数。
  4. 我们必须将**frequencyMap**转换为一对向量(**frequencyVector**)才能使用**std::sort**按频率排序元素。
  5. 我们创建一个名为**compareByFrequency**的特殊比较函数,该函数根据数据的出现频率对数据对进行排序。
  6. 我们利用我们独特的比较方法来比较频率,并使用**std::sort**对**frequencyVector**进行排序。
  7. 之后,项目按频率顺序打印。我们为排序向量中的每对显示一个元素,其次数与该元素的频率相同。