数据结构堆的向量实现
/**//*********************************************************************
Title:C++数据结构堆
Author:Zhen.liang
CopyRight:Diyinside Community CSTC
包括最小堆和最大堆两部分组成
*********************************************************************/
/**//*
for example:
#include <iostream>
#include "Heap.h"
using namespace std;
int main(){
DiyinsideHeap::MaxHeap<char> cdata(30);
cdata.Insert('3');
cdata.Insert('e');
cdata.Insert('k');
cout<<"Demo MinHeap"<<endl;
while(!cdata.IsEmpty()){
cout<<cdata.RemoveMin()<<endl;
}
return 0;
}
*/
#include <vector>
#include <assert.h>
using namespace std;
namespace DiyinsideHeap...{
//最小堆
template<class Type>
class MinHeap...{
public:
//构造函数空堆
MinHeap(int maxsize = 10)...{
assert(maxsize>=0);//限制输入大小为正
MaxHeapSize = maxsize;//堆大小
CurrentSize = 0;//当前存放大小
data.resize(MaxHeapSize);//存储空间设置
}
//析构函数
~MinHeap()...{
data.clear();
}
int HeapSize()const;//获得Heap大小
int Insert(const Type&);//插入元素
Type RemoveMin();//删除最小的元素
int IsEmpty()const;//判断是否空
int IsFull()const;//判断是否满
int MakeEmpty();//置空
private:
vector<Type> data;//存储数组
int CurrentSize;//当前存放个数
int MaxHeapSize;//最大存放个数
int FilterDown(int,int);//向下调整
int FilterUp(int);//向上调整
};
template<class Type>
int MinHeap<Type>::HeapSize()const...{
return CurrentSize;
}
template<class Type>
int MinHeap<Type>::MakeEmpty()...{
CurrentSize = 0;
return 1;
}
template<class Type>
Type MinHeap<Type>::RemoveMin()...{
if(!CurrentSize)...{
return -1;
}
else...{
Type temp = data[0];
data[0] = data[CurrentSize-1];
CurrentSize--;
FilterDown(0,CurrentSize-1);
return temp;
}
}
template<class Type>
int MinHeap<Type>::IsFull()const...{
if(CurrentSize == MaxHeapSize)...{
return 1;
}
else...{
return 0;
}
}
template<class Type>
int MinHeap<Type>::Insert(const Type& Data)...{
if(CurrentSize == MaxHeapSize)...{
return -1;
}
else...{
data[CurrentSize] = Data;
FilterUp(CurrentSize++);
return 1;
}
}
template<class Type>
int MinHeap<Type>::FilterUp(int start)...{
int j = start ;
int i = (j-1)/2;
Type temp = data[j];
while(j>0)...{
if(data[i]<=temp)...{
break;
}
else...{
data[j] = data[i];
j = i;
i = (i - 1)/2;
}
}
data[j] = temp;
return 1;
}
template<class Type>
int MinHeap<Type>::FilterDown(int start,int end)...{
int i = start ;
int j = 2*i + 1;
Type temp = data[i];
while(j<=end)...{
if((j<end) && (data[j]>data[j+1]))...{
j++;
}
if(temp<=data[j])...{
break;
}
else...{
data[i] = data[j];
i = j;
j = 2*j + 1;
}
}
data[i] = temp;
return 1;
}
template<class Type>
int MinHeap<Type>::IsEmpty()const...{
if(CurrentSize)...{
return 0;
}
else...{
return -1;
}
}
//最大堆
template<class Type>
class MaxHeap...{
public:
//构造函数空堆
MaxHeap(int maxsize = 10)...{
assert(maxsize>=0);
MaxHeapSize = maxsize;
CurrentSize = 0;
data.resize(MaxHeapSize);
}
//析构函数
~MaxHeap()...{
data.clear();
}
int HeapSize()const;//获得Heap大小
int Insert(const Type&);//插入元素
Type RemoveMin();//删除最小的元素
int IsEmpty()const;//判断是否空
int IsFull()const;//判断是否满
int MakeEmpty();//置空
private:
vector<Type> data;//存储数组
int CurrentSize;//当前存放个数
int MaxHeapSize;//最大存放个数
int FilterDown(int,int);//向下调整
int FilterUp(int);//向上调整
};
template<class Type>
int MaxHeap<Type>::HeapSize()const...{
return CurrentSize;
}
template<class Type>
int MaxHeap<Type>::MakeEmpty()...{
CurrentSize = 0;
return 1;
}
template<class Type>
Type MaxHeap<Type>::RemoveMin()...{
if(!CurrentSize)...{
return -1;
}
else...{
Type temp = data[0];
data[0] = data[CurrentSize-1];
CurrentSize--;
FilterDown(0,CurrentSize-1);
return temp;
}
}
template<class Type>
int MaxHeap<Type>::IsFull()const...{
if(CurrentSize == MaxHeapSize)...{
return 1;
}
else...{
return 0;
}
}
template<class Type>
int MaxHeap<Type>::Insert(const Type& Data)...{
if(CurrentSize == MaxHeapSize)...{
return -1;
}
else...{
data[CurrentSize] = Data;
FilterUp(CurrentSize++);
return 1;
}
}
template<class Type>
int MaxHeap<Type>::FilterUp(int start)...{
int j = start ;
int i = (j-2)/2;
Type temp = data[j];
while(j>0)...{
if(data[i]>=temp)...{
break;
}
else...{
data[j] = data[i];
j = i;
i = (i - 2)/2;
}
}
data[j] = temp;
return 1;
}
template<class Type>
int MaxHeap<Type>::FilterDown(int start,int end)...{
int i = start ;
int j = 2*i + 1;
Type temp = data[i];
while(j<=end)...{
if((j<end) && (data[j]<data[j+1]))...{
j++;
}
if(temp>=data[j])...{
break;
}
else...{
data[i] = data[j];
i = j;
j = 2*j + 1;
}
}
data[i] = temp;
return 1;
}
template<class Type>
int MaxHeap<Type>::IsEmpty()const...{
if(CurrentSize)...{
return 0;
}
else...{
return -1;
}
}
}
pku1442
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;
const int MAXN=30005;
struct TMax
{
TMax(int tx):x(tx) {}
int x;
};
struct TMin
{
TMin(int tx):x(tx) {}
int x;
};
int d[MAXN],g[MAXN];
int n,m;
priority_queue<TMax> hmax;
priority_queue<TMin> hmin;
bool operator<(const TMax &a,const TMax &b)
{
return a.x<b.x;
}
bool operator<(const TMin &a,const TMin &b)
{
return a.x>b.x;
}
void Read()
{
memset(d,0,sizeof(d));
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
int i;
for (i=1;i<=n;i++) scanf("%d",&d[i]);
for (i=1;i<=m;i++) scanf("%d",&g[i]);
}
void Work()
{
int i,j=1;
for (i=1;i<=n;i++)
{
if (!hmax.empty()&&d[i]<hmax.top().x)
{
hmin.push(TMin(hmax.top().x));
hmax.pop();
hmax.push(TMax(d[i]));
}
else hmin.push(TMin(d[i]));
while (j<=m&&g[j]==i)
{
printf("%d\n",hmin.top().x);
hmax.push(TMax(hmin.top().x));
hmin.pop();
j++;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
Read();
Work();
return 1;
}
用堆实现优先队列
#include<stdio.h>
typedef struct
{
int Object_ID;
int Priority;
}HEAP;
void siftdown(HEAP* a,int i,int n)
{ //adjust the factors' order
int j;
HEAP t;
t=a[i];
while((j=2*i+1)<n)
{
if(j<n-1&&a[j].Priority<a[j+1].Priority) j++;
if(t.Priority<a[j].Priority)
{
a[i]=a[j];
i=j;
}
else break;
}
a[i]=t;
}
void heap_sort(HEAP* a,int n)
{//put the factors in hesp for each time and sort them for each time
int i;
HEAP t;
for(i=(n-2)/2;i>=0;i--)
siftdown(a,i,n);
for(i=n-1;i>0;i--)
{
t=a[0];
a[0]=a[i];
a[i]=t;
siftdown(a,0,i);
}
}
void changeweight(HEAP* a,int& num,int Object_ID, int new_priority)
{
for(int i=0;i<num;i++)
if(a[i].Object_ID==Object_ID) break;
if(i==num) printf("No such Object_ID!\n");
a[i].Priority=new_priority;
heap_sort(a,num);
}
void dequeue(HEAP* a,int& num,int& Object_ID)
{
Object_ID=a[0].Object_ID;
for(int i=0;i<num-1;i++)
a[i]=a[i+1];
num--;
heap_sort(a,num);
}
void enqueue(HEAP* a,int &num,int Object_ID, int priority)
{
a[num].Object_ID=Object_ID;
a[num++].Priority=priority;
}
bool isLeaf(HEAP *h,int& num,int i)
{
if(i>num/2) return true;
return false;
}
int leftChild(HEAP *h,int& num,int i)
{
if(2*i>num) return -1; //the node has not a left child
return 2*i;
}
void main()
{
int Object_ID,Priority;
HEAP h[50];
int num;
num=0;
while(Object_ID)
{
scanf("%d%d",&Object_ID,&Priority);
if(!Object_ID) break;
enqueue(h,num,Object_ID,Priority);
}
heap_sort(h,num);
for(int i=0;i<num;i++)
printf("%d\t%d\n",h[i].Object_ID,h[i].Priority);
}