Data Structures (Weiss) Chapter 6: Binary Heap, Priority Queue

//

//  main.cpp

//  Data Structure TRY1

//

//  Created by zr9558 on 6/7/13.

//  Copyright (c) 2013 zr9558. All rights reserved.

//



// Data Structure C++, Weiss, P.216 Priority Queues (Heaps)

// Here, we do not use array[0], the priority queue is from array[1].


#include<iostream>

using namespace std;

#include<vector>

#include<list>

#include<algorithm>



template<typename Comparable>

class BinaryHeap

{

public:

    BinaryHeap( int capacity=100):array(capacity){ currentSize=0;}

    BinaryHeap( const vector<Comparable> &items)

    :array(items.size()+10), currentSize(items.size())

    {

        for( int i=0; i<items.size(); ++i)

            array[i+1]=items[i];

        

        buildHeap();

    }

    

    bool isEmpty() const

    {

        return currentSize==0;

    }

    

    const Comparable &findMin() const

    {

        return array[1];

    }

    

    void insert( const Comparable &x);

    

    void deleteMin(); // delete minimum from the binaryheap;

    void deleteMin( Comparable & minItem); // delete minimum from the binaryheap, and save the minimum in minItem;

    

    void makeEmpty()

    {

        array.clear();

    }

    

    

private:

    int currentSize;          // Number of elements in heap

    vector<Comparable> array; // The heap array

    

    void buildHeap()

    {

        for( int i=currentSize/2; i>0; --i)

            percolateDown(i);

    }

    

    void percolateDown( int hole)

    {

        int child;

        Comparable tmp=array[hole];

        

        for(; hole*2<=currentSize; hole=child)

        {

            child=hole*2;

            if( child!=currentSize && array[child+1]<array[child])

                child++;

            if( array[child]<tmp)

                array[hole]=array[child];

            else break;

        }

        array[hole]=tmp;

    }

};



template<typename Comparable>

void BinaryHeap<Comparable>::insert( const Comparable &x)

{

    if( currentSize==array.size()-1)

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

    

    //Percolate up

    int hole=++currentSize;

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

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

    

    array[hole]=x;

}


template<typename Comparable>

void BinaryHeap<Comparable>::deleteMin()

{

    array[1]=array[currentSize--];

    percolateDown(1);

}


template<typename Comparable>

void BinaryHeap<Comparable>::deleteMin( Comparable &minItem)

{

    minItem=array[1];

    

    array[1]=array[currentSize--];

    percolateDown(1);

}







int main()

{

    BinaryHeap<int> H;

    

    for( int i=5; i<40; ++i)

        H.insert(i%23);

    

    while( !H.isEmpty())

    {

        cout<<H.findMin()<<" ";

        H.deleteMin();

    }

    

    cout<<endl;

    

    

    

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值