堆作为最大优先级队列

堆的各种操作:

用数组来表示堆,i结点的父结点就为(i1) / 2。它的左右子结点下标分别为2 * i + 12 * i + 2。如第0个结点左右子结点下标分别为12

void max_heapify(int[],int);  //保持堆的性质
void buid_max_heap(int []);  //建堆
void max_heap_sort(int []);  //堆排序
int heap_maximum(int[]);  //返回最大值
void max_heap_increase(int[],int i,int key); //使第i个元素的值增加到key 
void max_heap_insert(int [],int key); //把元素key插入到堆中 
int max_heap_extarct_max(int[]); //去掉并返回A中最大的元素 


#include<iostream>
using namespace std;

int heap_size;    //堆的大小 
int n;  //数组A中元素的个数 n<=1000 

void max_heapify(int[],int);
void buid_max_heap(int []);
void max_heap_sort(int []);  //堆排序
int heap_maximum(int[]);  //返回最大值
void max_heap_increase(int[],int i,int key); //使第i个元素的值增加到key 
void max_heap_insert(int [],int key); //把元素key插入到堆中 
int max_heap_extarct_max(int[]); //去掉并返回A中最大的元素 

int main(){
	int A[1000]; //堆的最大容量为1000 
	cin>>n; 
	heap_size=n; 
	for(int i=0;i<n;i++) cin>>A[i];
	buid_max_heap(A);
	cout<<"堆中的最大元素为"<<heap_maximum(A);	
	cout<<endl;
	
	int a;
	cout<<"请输入一个元素,这个元素将插入到堆中:";
	cin>>a;
	max_heap_insert(A,a);
	cout<<"插入"<<a<<"之后的堆为:";
	for(int i=0;i<n;i++)
		cout<<A[i]<<" ";
	cout<<endl;
	
	cout<<"堆中的最大元素为:"<<max_heap_extarct_max(A)<<",将其去掉。";
	cout<<"\n去掉最大元素之后的堆为:";
	for(int i=0;i<n;i++)
		cout<<A[i]<<" ";
	cout<<endl;
	
	cout<<"请输入一个元素号,和想要增加到的key:";
	int e_num,key;
	cin>>e_num>>key; 
	while(e_num>=n||key<=A[e_num]){
		cout<<"输入错误,请重新输入:";
		cin>>e_num>>key;
	}
	max_heap_increase(A,e_num,key);
	cout<<"将第"<<e_num<<"号元素增加到"<<key<<"之后的堆为:";
	for(int i=0;i<n;i++)
		cout<<A[i]<<" ";
	cout<<endl;
	
	max_heap_sort(A);   
	cout<<"堆排序,结果为:";
	for(int i=0;i<n;i++)
		cout<<A[i]<<" ";
	cout<<endl;
	getchar(); 
}

void max_heapify(int A[],int i){
	int l=i*2+1;
	int r=i*2+2;
	int largest;
	if(l<heap_size&&A[l]>A[i])
		largest=l;
	else largest=i;
	if(r<heap_size&&A[r]>A[largest])
		largest=r;
	if(largest!=i){
		swap(A[i],A[largest]);
		max_heapify(A,largest);
	}
}

void buid_max_heap(int A[]){
	heap_size=n;	
	for(int i=(n-1)/2;i>=0;i--)
		max_heapify(A,i);    //堆从(len-1)/2到0都是非叶子结点 
} 

void max_heap_sort(int A[]){
	buid_max_heap(A);
	for(int i=n-1;i>=1;i--){
		swap(A[0],A[i]); 
		//现在A[i]就是最大值  
		heap_size--;
		max_heapify(A,0);
	}
}


int heap_maximum(int A[]){
	return A[0];
} 

void max_heap_increase(int A[],int i,int key){	
	A[i]=key;
	while(i>0&&A[(i-1)/2]<A[i]){
		swap(A[i],A[(i-1)/2]);
		i=(i-1)/2;
	}
}
void max_heap_insert(int A[],int key){
	A[heap_size]=-9999999;  //负无穷 
	max_heap_increase(A,heap_size,key);
	n++;
	heap_size++;
}
int max_heap_extarct_max(int A[]){
	if(heap_size<1) cout<<"heap overflow!"<<endl;
	else{
		int max=A[0];
		A[0]=A[heap_size-1];
		heap_size--;
		max_heapify(A,0);
		return max;
	} 
} 



结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值