堆得些许应用

正儿八经的堆:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值