题目
假如heap中有一个位置的数发生了变化,但是不知道是变大了还是变小了,怎么把堆调对呢?
解析
对这个位置分别进行一次上升、一次下降。举个例子就知道了
//最大---登顶
void heapUp(std::vector<int> &vec, int i){
while (vec[i] > vec[(i - 1) / 2]){
std::swap(vec[i] , vec[(i - 1) / 2]);
i = (i - 1) / 2;
}
}
// 小的往下
void heapDown(std::vector<int> &vec, int i){
int s = vec.size();
int p = i, l = p * 2 + 1;
while (l < s){
int ma = (l + 1 < s) && (vec[l + 1] < vec[l]) ? l + 1 : l; // 找出左右孩子中较大的索引
ma = vec[ma] < vec[p] ? ma : p; // 孩子与父亲比较,找到最大的那个的索引
if(ma == p){ //父亲已经是最大的了
break;
}
std::swap(vec[ma], vec[p]);
p = ma;
l = p * 2 + 1;
}
}
void justHeap(std::vector<int> &vec, int i){
heapUp(vec, i);
}