建堆操作仅需要O(n)的时间复杂度,可用来找最大值或者TOP(k)问题。
需要注意移位操作(<<)的优先级比加/减(+/-)的低,需要加括号。
#include <iostream>
#include <vector>
using namespace std;
void down(vector<int> &a, int i)
{
int n = a.size();
while (((i << 1) + 1) < n || ((i << 1) + 2) < n)
{
int j = (((i << 1) + 1) < n ? a[(i << 1) + 1] : INT_MIN) < (((i << 1) + 2) < n ? a[(i << 1) + 2] : INT_MIN) ? (i << 1) + 2 : (i << 1) + 1;
if (a[i] < a[j])
{
swap(a[i], a[j]);
i = j;
}
else
return;
}
return;
}
void heapify(vector<int> &a)
{
int n = a.size();
for (int i = ((n >> 1) - 1); i >= 0; i--)
{
down(a, i);
}
return;
}
int main()
{
vector<int> a{ 2,1,6,3,9,7,4,8,5 };
heapify(a);
for (int i : a)
cout << i << " ";
return 0;
}