数据结构堆的实现
堆的实现
// 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;
}
版权声明:
浙公网安备 33010602011771号