• MinHeap.h

    template<typename Type> class MinHeap{
    public:
    	MinHeap(int size):m_nMaxSize(size > defaultsize ? size : defaultsize)
    			,m_pheap(new Type[m_nMaxSize]),m_ncurrentsize(0){}
    	MinHeap(Type heap[],int n);		//initialize heap by a array
    	~MinHeap(){
    		delete[] m_pheap;
    	}
    
    public:
    	bool Insert(const Type item);	//insert element
    	bool Delete(const Type item);	//delete element
    	bool IsEmpty() const{			
    		return m_ncurrentsize == 0;
    	}
    	bool IsFull() const{
    		reutrn m_ncurrentsize == m_nMaxSize;
    	}
    	void Print(const int start=0, int n=0);			
    
    private:
        //adjust the elements of the child tree with the root of start from top to bottom
    	void Adjust(const int start, const int end);	
    
    private:
    	static const int defaultsize = 100;
    	const int m_nMaxSize;	
    	Type *m_pheap;
    	int m_ncurrentsize;
    };
    
    template<typename Type> void MinHeap<Type>::Adjust(const int start, const int end){
    	int i = start,j = i*2+1;    //get the position of the child of i
    	Type temp=m_pheap[i];
    	while(j <= end){    
    		if(j<end && m_pheap[j]>m_pheap[j+1]){   //left>right
    			j++;
    		}
    		if(temp <= m_pheap[j]){ //adjust over
    			break;
    		}
    		else{   //change the parent and the child, then adjust the child
    			m_pheap[i] = m_pheap[j];
    			i = j;
    			j = 2*i+1;
    		}
    	}
    	m_pheap[i] = temp;
    }
    
    template<typename Type> MinHeap<Type>::MinHeap(Type heap[], int n):m_nMaxSize(
    		n > defaultsize ? n : defaultsize){
    	m_pheap = new Type[m_nMaxSize];
    	for(int i=0; i<n; i++){
    		m_pheap[i] = heap[i];
    	}
    	m_ncurrentsize = n;
    	int pos=(n-2)/2;	//Find the last child tree which has more than one element;
    	while(pos>=0){
    		Adjust(pos, n-1);
    		pos--;
    	}
    }
    
    template<typename Type> bool MinHeap<Type>::Insert(const Type item){
    	if(m_ncurrentsize == m_nMaxSize){
    		cerr<<"Heap Full!"<<endl;
    		return 0;
    	}
    	m_pheap[m_ncurrentsize] = item;
    	int j = m_ncurrentsize, i = (j-1)/2;    //get the position of the parent of j
    	Type temp = m_pheap[j];
    	while(j > 0){   //adjust from bottom to top
    		if(m_pheap[i] <= temp){
    			break;
    		}
    		else{
    			m_pheap[j] = m_pheap[i];
    			j = i;
    			i = (j-1)/2;
    		}
    	}
    	m_pheap[j] = temp;
    	m_ncurrentsize++;
    	return 1;
    }
    
    template<typename Type> bool MinHeap<Type>::Delete(const Type item){
    	if(0 == m_ncurrentsize){
    		cerr<<"Heap Empty!"<<endl;
    		return 0;
    	}
    	for(int i=0; i<m_ncurrentsize; i++){
    		if(m_pheap[i] == item){
    			m_pheap[i] = m_pheap[m_ncurrentsize-1]; //filled with the last element
    			Adjust(i,m_ncurrentsize-2);     //adjust the tree with start of i
    			m_ncurrentsize--;
    			i=0;
    		}
    	}
    	return 1;
    }
    
    template<typename Type> void MinHeap<Type>::Print(const int start, int n){
    	if(start >= m_ncurrentsize){
    		return;
    	}
    	Print(start*2+2, n+1);  //print the right child tree
    
    	for(int i=0; i<n; i++){
    		cout<<"    ";
    	}
    	cout<< m_pheap[start] << "--->" << endl;
    
    	Print(start*2+1, n+1);  //print the left child tree
    }
    
    

    test.cpp
    #include <iostream>
    
    using namespace std;
    
    #include "MinHeap.h"
    
    int main(){
    	int init[30]={17,6,22,29,14,0,21,13,27,18,2,28,8
    			,26,3,12,20,4,9,23,15,1,11,5,19,24,16,7,10,25};
    	MinHeap<int> heap(init,30);
    	heap.Print();
    	cout<<endl<<endl<<endl;
    
    	heap.Insert(20);
    	heap.Print();
    	cout<<endl<<endl<<endl;
    	
    	heap.Delete(20);
    	heap.Print();
    	cout<<endl<<endl<<endl;
    	return 0;
    }
    
  • 相关阅读:
    探索式测试实践之路
    管理是什么?真正的管理者是,“管”+“理”!
    JavaScript中的函数式编程
    node js的终端中 console.log 嵌套对象会被折叠的问题
    apt-get install的默认安装路径
    nodejs 事件循环 试题思考
    仅20行的JavaScript模板引擎
    js 驼峰命名转烤串
    git reset 进阶
    linux 拷贝文本到剪切板
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2438070.html
Copyright © 2020-2023  润新知