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
相关产品推荐
相关产品推荐

