#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define LEFT(i) 2*(i)
#define RIGHT(i) 2*(i)+1
#define PARENT(i) (i)/2
int size = 15;
void h_swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
void max_heapfy(int a[],int i)
{
int max;
int l;
int r;
l=LEFT(i);
r=RIGHT(i);
if(l<=size&&a[l]>a[i]){
max=l;
}
else{
max=i;
}
if(r<=size&&a[r]>a[max]){
max = r;
}
if(max!=i)
{
h_swap(a[max],a[i]);
max_heapfy(a,max);
}
}
void BuildHeap(int a[])
{
for(int i=size/2;i>=1;i--)
{
max_heapfy(a,i);
}
}
void print(int a[],int n)
{
int i=1;
while(i<=n)
{
cout<<a[i]<<" ";
i++;
}
cout<<endl;
}
int Heap_max(int a[])
{
return a[1];
}
int Heap_extract_max(int a[])
{
if(size<1){
cout<<"heap is NULL"<<endl;
exit(-1);
}
int max;
max=a[1];
h_swap(a[1],a[size]);
size--;
max_heapfy(a,1);
return max;
}
void heap_increase_key(int a[],int i,int key)
{
if(key<a[i]){
cout<<"key is smaller than a[i]"<<endl;
exit(-1);
}
a[i] = key;
while(i>1&&PARENT(i)<a[i])
{
h_swap(a[i],a[PARENT(i)]);
i=PARENT(i);
}
}
void max_heap_insert(int a[],int key)
{
size=size+1;
a[size] = 0xffffffff;
heap_increase_key(a,size,key);
}
int main()
{
int a[101];
srand(time(0));
for(int i=1;i<=size;i++)
{
a[i]=rand()%100*size;
}
BuildHeap(a);
print(a,size);
cout<<Heap_extract_max(a)<<endl;
print(a,size-1);
heap_increase_key(a,10,100000);
print(a,size);
max_heap_insert(a,100);
print(a,size);
return 0;
}
heap实现的最大优先队列
最新推荐文章于 2022-10-10 16:37:40 发布