码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构堆的实现

时间:2015-08-27 21:18:14      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

堆的实现

// 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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构堆的实现

标签:

原文地址:http://blog.csdn.net/u014568921/article/details/48034211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!