You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ minHeap的bubbleUp函数中同优先级元素如何按字典序比较

C++ 最小堆bubbleUp同优先级按字典序排序的实现方案

首先明确比较规则:最小堆的父节点优先级要高于子节点,优先级相等时父节点的字符串字典序要更小,否则需要交换上滤。

原参考代码存在的问题

  • 多处语法错误:括号不匹配、多余符号
  • 递归调用参数错误:bubbleUp 接收的是索引参数,原代码错误传入了vector元素值
  • 函数名大小写错误:递归调用时写成了bubbleup,和声明的bubbleUp不一致

正确的判断条件编写

你可以直接把两个判断逻辑合并成一个复合条件,也可以分开判断,两种写法都可以:

写法1:合并判断(更简洁)

void MinHeap::bubbleUp(int pos)
{
    // 根节点不需要上滤
    if (pos <= 0) return;
    int parent = (pos - 1) / d; // 提前计算父节点索引,避免重复计算
    // 核心判断:子节点优先级更小,或者优先级相等但子节点字典序更小,就交换
    if (vec[pos].second < vec[parent].second || 
        (vec[pos].second == vec[parent].second && vec[pos].first < vec[parent].first))
    {
        swap(vec[pos], vec[parent]);
        bubbleUp(parent); // 递归处理父节点位置
    }
}

写法2:分开判断(和你原代码逻辑一致的修复版)

void MinHeap::bubbleUp(int pos)
{
    if (pos <= 0) return;
    int parent = (pos - 1) / d;
    if (vec[pos].second < vec[parent].second)  
    {
        swap(vec[pos], vec[parent]);
        bubbleUp(parent);
    }
    else if (vec[pos].second == vec[parent].second)
    {
        if(vec[pos].first < vec[parent].first)
        {
            swap(vec[pos], vec[parent]);
            bubbleUp(parent);
        }
    }
}

逻辑说明

C++的std::string的<运算符默认就是按字典序比较的,直接使用vec[pos].first < vec[parent].first就能满足“字典序更小的元素排更靠前”的需求。

内容的提问来源于stack exchange,提问作者coderlegend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:09:03