数据结构堆的实现

堆的实现

// heap.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;

#define LARGENUM 1000000


class Heap
{
private:
	vector<int> array;

	int find(int tofind)
	{
		vector<int>::iterator it;
		it = std::find(array.begin(), array.end(), tofind);
		return it == array.end() ? -1 : it - array.begin();
	}
public:
	Heap()//构造
	{
		array.push_back(LARGENUM);//哨兵
	}

	void insert(const int val)//插入
	{
		_ASSERTE(val < LARGENUM);
		array.push_back(val);
		int index = array.size() - 1;
		while (array[index] > array[index / 2])
		{
			array[index] = array[index/ 2];
			array[index / 2] = val;
			index = index / 2;
		}
	}

	bool erase(int val)//删除
	{
		int index = find(val);
		if (index < 0)
			return false;
		array[index] = array.back();
		array.pop_back();
		while (index * 2 < array.size())
		{
			int t = array[index];
			if (2 * index + 1 < array.size())
			{
				if (array[index] > array[2 * index] && array[index] > array[2 * index + 1])
					return true;
				int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index;
				array[index] = array[nn];
				array[nn] = t;
				index = nn;
			}
			else
			{
				if (array[index] > array[2 * index])
					return true;
				int t = array[index];
				array[index] = array[2 * index];
				array[2 * index] = t;
				return true;
			}

		}
		
	}

	int top()//返回堆顶
	{
		_ASSERTE(array.size() != 1);
		return  array[1];
	}

	void pop()//弹出堆顶
	{
		_ASSERTE(array.size() != 1);
		array[1] = array.back();
		array.pop_back();
		int index = 1;
		
		while (index * 2 < array.size())
		{
			int t = array[index];
			if (2 * index + 1 < array.size())
			{
				if (array[index] > array[2 * index] && array[index] > array[2 * index + 1])
					return;

				int nn = array[2 * index + 1] > array[2 * index] ? 2 * index + 1 : 2 * index;
				array[index] = array[nn];
				array[nn] = t;
				index = nn;
			}
			else
			{
				if (array[index] > array[2 * index])
					return;
				int t = array[index];
				array[index] = array[2 * index];
				array[2 * index] = t;
				return;
			}

		}
	}

	
	bool empty()
	{
		return array.size() == 1;
	}

	int size()//返回堆的大小
	{
		return array.size() - 1;
	}

};

int _tmain(int argc, _TCHAR* argv[])
{
	
	Heap h;
	h.insert(10);
	h.insert(35);
	h.insert(19);
	h.insert(5); 
	h.insert(2); 
	h.insert(51);
	h.insert(37);
	h.insert(7);
	h.insert(45);
	h.insert(63);
	cout << h.size() << endl;
	cout << h.top()<< endl;
	h.pop();
	cout << h.size() << endl;
	cout << h.top() << endl;
	h.erase(45);

	system("pause");
	return 0;
}


版权声明:

posted on 2015-08-27 20:21  moffis  阅读(165)  评论(0编辑  收藏  举报

导航