模板库-最大堆的实现

MinHeap.h

/*
 * MinHeap.h
 *
 *  Created on: 2011-9-21
 *      Author: brunie
 */

#ifndef MINHEAP_H_
#define MINHEAP_H_

#include <iostream>
#include <cstdlib>
using namespace std;

#define  STEP 500

template<class T>
struct Less
{
		bool operator()(T &a, T &b)
		{
			return a < b;
		}
};

template<class T, class Compare = Less<T> >
class MinHeap
{
	public:
		MinHeap();

		MinHeap(int n);

		MinHeap(T *array, int n);

		virtual~MinHeap();

		void Initialize();

		bool Insert(const T &x);

		bool DeleteMin(T &x);

		int Size();

		int Sort();

	private:

		bool allocator(T* &heap, int n);

		int copy(T *src, T* des, int n);

		int size;
		int MaxSize;
		T 	*heap;

};



template<class T, class Compare>
MinHeap<T, Compare>::MinHeap()
{
	MaxSize = STEP;
	size = 0;
	heap = new T[size + 1];
}

template<class T, class Compare>
MinHeap<T, Compare>::MinHeap(int n)
{
	MaxSize = n;
	size = 0;
	heap = new T[size + 1];
}

template<class T, class Compare>
MinHeap<T, Compare>::MinHeap(T *array, int n)
{
	MaxSize = STEP;
	if(n > MaxSize)
	{
		do{
			MaxSize += STEP;
		}while(MaxSize < n);
	}
	allocator(heap, MaxSize);
	copy(array, heap, n);
	size = n;
}

template<class T, class Compare>
MinHeap<T, Compare>::~MinHeap()
{
	if (NULL != heap)
		delete heap;
	heap = NULL;
}

template<class T, class Compare>
bool MinHeap<T, Compare>::allocator(T* &heap, int n)
{
	heap = new T[n];
	if(NULL != heap)
		return true;
	return false;
}

template<class T, class Compare>
int MinHeap<T, Compare>::copy(T *src, T* des, int n)
{
	int i;
	for (i = 1; i <= n; i++)
		des[i] = src[i];
	return n;
}

template<class T, class Compare>
void MinHeap<T, Compare>::Initialize()
{
	int i;
	for (i = size / 2; i >= 1; i--)
	{
		T y = heap[i]; // root of subtree

		int c = 2 * i; // parent of c is target
		// location for y
		while (c <= size)
		{
			if (c < size && Compare(heap[c + 1], heap[c]))
				c++;

			if(!Compare(heap[c], y))
				break;

			heap[c / 2] = heap[c];
			c *= 2;
		}
		heap[c / 2] = y;
	}
}

template<class T, class Compare>
bool MinHeap<T, Compare>::Insert(const T &x)
{
	if (size == MaxSize)
	{
		T *tmp = heap;
		if(!allocator(heap, MaxSize + STEP))
			return false;
		MaxSize += STEP;
		copy(tmp, heap, size);
	}

	int i = ++size;
	while (i != 1 && Compare(x , heap[i/2]))
	{
		heap[i] = heap[i/2];
		i /= 2;
	}
	heap[i] = x;

	return true;
}

template<class T, class Compare>
bool MinHeap<T, Compare>::DeleteMin(T &x)
{
	if (size == 0)
	return false;

	x = heap[1];

	T y = heap[size--];

	int i = 1,ci = 2;
	while (ci <= size)
	{
		if (ci < size && Compare(i, ci))  //Compare(heap[ci + 1], heap[ci])
			ci++;

		if(!Compare(heap[ci], y))
			break;

		heap[i] = heap[ci];
		i = ci;
		ci *= 2;
	}
	heap[i] = y;

	return true;
}

template<class T, class Compare >
int MinHeap<T, Compare>::Size()
{
	return size;
}

template<class T, class Compare >
int MinHeap<T, Compare>::Sort()
{
	int i;
	T x;
	for(i = 1; i < size; i++)
	{
		DeleteMin(x);
		heap[size - i + 1] = x;
	}
	return size;
}

#endif /* MINHEAP_H_ */
Main.cpp

/*
 * Main.cpp
 *
 *  Created on: 2011-9-21
 *      Author: brunie
 */

#include "MinHeap.h"

int main()
{
	MinHeap<int> *heap = new MinHeap<int>();
	int i;
	for (i = 10; i > 0; i--)
		heap->Insert(i);
	int n;
	for (i = 1; i < 11; i++)
	{
		heap->DeleteMin(n);
		cout<<" "<<n;
	}

	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值