用数组实现小顶堆(二叉堆)的C++代码

本文详细介绍了堆排序算法的基本原理、实现过程及在不同场景的应用。通过代码实例,展示了如何利用最小堆优化数据排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <vector>

using namespace std;

class minHeap
{
private:
    vector<int> array;
    int theSize;
public:
    minHeap()
    {
        array = vector<int>(100);
        theSize =0;
    }
    void Insert(int theData);
    void Delete(int pos);
    void Print();
};

//插入函数,主要是将元素下滚,hole上滚,因为插入的位置是在最后,

//故hole在最后,所以像hole中滚动就是下滚

void minHeap::Insert(int theData)
{
    if(theSize+1>array.size())

        array.resize(array.size()*2);

//最后一个元素的下一个位置形成一个hole,以便接受滚下来的元素

    int hole = ++theSize;

//hole向前移动的结束条件是hole到头或者hole的父节点元素比要插入的元素小

    for(; hole > 1 && array[hole/2] > theData; hole = hole/2)

//hole的父节点元素滚入到hole,hole=hole/2实现了hole滚动到父节点

        array[hole]=array[hole/2];

//hole滚动到合适位置了,将要插入的元素填入到hole

    array[hole]=theData;

}

//删除指定位置元素的函数,该位置以前的位置不动,以后的位置主要是将元素上滚,

//hole下滚,因为删除后是拿最后一个元素来作为删除后剩下的hole的值,

//很大,故hole要下滚

void minHeap::Delete(int pos)

{

//删除的位置大于heap的边界,返回错误

    if(theSize < pos)
    {    
        cout<<"error!"<<endl;
        return;

    }

//删除的位置留下一个hole

    int hole = pos;

//最后一个元素的值放入到tmp,也就是hole中,准备比较,然后下滚

    int tmp = array[theSize--];

//hole还有子节点,也就是hole还有下滚的余地

    while(hole*2 <= theSize)
    {

        int child;

//hole只有一个子节点,则child只能是这个值

        if(hole*2 == theSize)

            child = hole*2;

//这个if else是拿hole两个子节点中教小的值和hole作比较,

//让较小的值滚上来成为较大值的父节点,

//hole替代较小值的位置

        if(array[hole*2]>array[hole*2+1])
        {
            child = hole*2+1;
        }
        else
        {
            child = hole*2;

        }

//较小子节点上滚

        array[hole] = array[child];

//hole下滚

        hole = child;

    }

//hole没有下滚的余地了,将hole中填上滚之前的heap的最后一个元素

    array[hole] = tmp;
}

void minHeap::Print()
{
    for(int i=1;i<=theSize;i++)
        cout<<array[i]<<endl;
}

int main()
{
    minHeap heap;
    heap.Insert(7);
    heap.Insert(1);
    heap.Insert(3);
    heap.Insert(4);
    heap.Insert(2);
    heap.Insert(12);
    heap.Insert(10);
    heap.Insert(17);
    cout<<"**************************"<<endl;
    heap.Print();
    heap.Delete(2);
    cout<<"**************************"<<endl;
    heap.Print();
    heap.Insert(5);
    cout<<"**************************"<<endl;
    heap.Print();
    return 1;

}

参考自:[数据结构与算法分析–C.描述(第3版)](美)Mark.Allen.Weiss.扫描版(P172)

运行结果如下图:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值