堆排序

#include <algorithm>
#include <iostream>
#include <vector>
#include <exception>

void sink(std::vector<int> &base, int i)
{
    int l = i * 2 + 1;
    int r = i * 2 + 2;
    if (base.size() <= l)
    {
        return;
    }
    if (base.size() <= r)
    {
        if (base[l] < base[i])
        {
            std::swap(base[l], base[i]);
        }
        return;
    }
    if (base[l] < base[r] && base[l] < base[i])
    {
        std::swap(base[l], base[i]);
        return sink(base, l);
    }
    if (base[r] < base[l] && base[r] < base[i])
    {
        std::swap(base[r], base[i]);
        return sink(base, r);
    }
}

void make_heap(std::vector<int> &base)
{
    for (int i = base.size() - 1; i >= 0; i--)
    {
        sink(base, i);
    }
}

int pop_heap(std::vector<int> &base)
{
    if (base.size() == 0)
    {
        throw std::runtime_error("");
    }
    int top = base.front();
    base.front() = base.back();
    base.pop_back();
    sink(base, 0);
    return top;
}

int main()
{
    std::vector<int> hp = {9, 2, 1, 4, 5, 6, 7};
    make_heap(hp);
    while (!hp.empty())
    {
        int i = pop_heap(hp);
        std::cout << i << ' ';
    }
    return 0;
}

全部评论
专家就是专家 学到了
点赞 回复 分享
发布于 2024-10-20 12:34 湖北

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务