正儿八经的堆:
void shift_down(int i)
{
while (i * 2 <= n)
{
int t = i * 2;
if (t + 1 <= n && hp[t + 1] < hp[t])
t++;
if (hp[i] > hp[t])
swap(hp[i], hp[t]);
else
break;
i = t;
}
}
void shift_up(int i)
{
while (i / 2 >= 1)
{
if (hp[i] < hp[i / 2])
swap(hp[i / 2], hp[i]);
else
break;
i /= 2;
}
}
建堆:
int main()
{
Fast_io;
for (i = n / 2; i >= 1; i--)
shift_down(i);
for (i = 1; i <= n; i++)
{
int t;
cin >> t;
hp[i] = t;
shift_up(i);
}
return 0;
}
Shift_down 和 Shift_up的建堆不一样 :
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e3 + 50;
int n, m, h[N];
void Shift_down(int i)
{
while (i * 2 <= n)
{
int t = i * 2;
if (t + 1 <= n && h[t + 1] > h[t])
t++;
if (h[i] < h[t])
swap(h[i], h[t]);
else
break;
i = t;
}
}
inline void Shift_up(int i)
{
while (i / 2 >= 1) {
int t = i / 2;
if (h[i] > h[t]) swap(h[i], h[t]);
else break;
i = t;
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> h[i];
for (int i = n / 2; i >= 1; i--)
Shift_down(i);
for (int i = 1; i <= n; i++) cout << h[i] << ' ';
cout << endl;
return 0;
}
// 7
// 1 2 3 4 5 6 7
//Shift_down : 7 4 6 1 3 2 5
//Shift_up : 7 5 6 4 2 1 3