用数组构建最小堆

直接给出代码如下

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

using namespace std;

class minHeap
{
    private:
        int maxSize;//heap中存放元素的最大数量
        int index;//有效数据游标
        int *heapArray;
    public:
        minHeap(int size);
        virtual ~minHeap();
        int insert(int val);
        int pop(int *res);
        void printHeap();
        
};

void minHeap::printHeap()
{
    int i = 0;
    cout<<"print mini heap:"<<endl;
    for(i=0; i<=this->index; i++)
    {
        cout<<this->heapArray[i]<<" ";
    }
    cout<<endl;
    return;

}
minHeap::minHeap(int size)
{
    if(size <= 0)
    {
        this->heapArray = NULL;
        return;
    }
    
    this->heapArray = (int*)malloc(sizeof(int)*size);
    if(NULL == this->heapArray)
    {
        cout<<"malloc heap array failed"<<endl;
    }
    this->maxSize = size;
    this->index = -1;
    memset(this->heapArray, 0, sizeof(int)*size);
}


int minHeap::insert(int val)
{
    int x = 0;
    int i = this->index;
    int j = 0;
    //堆已经放满了
    //暂时不支持heap扩展
    if(i >= this->maxSize -1)
    {
        return -1;
    }

    i++;
    
    while(i > 0)
    {
        j = (i-1)/2;//parent
        if(val >= this->heapArray[j])
        {
            break;
        }
        this->heapArray[i] = this->heapArray[j];
        i = j;
    }
    
    this->heapArray[i] = val;
    this->index++;
    return 0;
}

int minHeap::pop(int *res)
{
    int val = 0;
    int i = 0;
    int j = 0;
    if(this->index < 0 || this->heapArray == NULL)
    {
        cout << "the heap is empty." <<endl;
        return -1;
    }
    //返回堆顶不元素
    *res = this->heapArray[0];
    //取最后一个元素
    val = this->heapArray[this->index];
    i = 0;
    j = 2*i+1;
    //从根节点开始调整
    while(j <= this->index)
    {
        if(j<this->index && this->heapArray[j] > this->heapArray[j+1])
        {
            j++;
        }
        
        if(val < this->heapArray[j])
        {
            break;
        }
        this->heapArray[i] = this->heapArray[j];
        i = j;
        j = 2*i+1;
    }
    this->heapArray[i] = val;
    this->index--;
    return 0;
}

minHeap::~minHeap()
{
    free(this->heapArray);
    this->maxSize = 0;
    this->index = -1;
}

int main(int argc, char **argv)
{
    minHeap *pHeap = new minHeap(10);
    int i = 0;
    int res = 0;
    for(i=0; i<10; i++)
    {
        pHeap->insert(10-i);
    }
    pHeap->printHeap();

    cout<<"pop start"<<endl;
    pHeap->pop(&res);
    cout << res <<endl;
    pHeap->pop(&res);
    cout << res <<endl;
    pHeap->pop(&res);
    cout << res <<endl;
    
    cout<<"pop end"<<endl;
    pHeap->printHeap();
    delete pHeap;
    return 0;
}

  

  

猜你喜欢

转载自www.cnblogs.com/real-madrid/p/9752198.html
今日推荐