堆排序

#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 湖北

相关推荐

昨天 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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