堆实现的最小优先级队列

算法导论堆实现的最小优先级队列,本来应该用vector来实现的,当时没考虑到MIN_HEAP_INSERT方法会改变堆大小。有空再来改吧。另外不大清楚C++应该用什么来表示正无穷呢

 

 

 

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

void exchange(int &a,int &b){
	int temp=b;
	b=a;
	a=temp;
}
void min_heapify(int *A,int i,int heapsize)
{
	int min;
	int l=2*i+1;
	int r=2*i+2;
	if(l<=heapsize-1&&A[l]<A[i])
		min=l;
	else
		min=i;
	if(r<=heapsize-1&&A[r]<A[min])
		min=r;
	if(min!=i){
		exchange(A[i],A[min]);
		min_heapify(A,min,heapsize);
	}
	

}

void build_min_heap(int *A,int heapsize){
	for(int i=heapsize/2-1;i>=0;i--)
		min_heapify(A,i,heapsize);
}

int heap_minimum(int *A){
	return A[0];
}
int heap_extract_min(int *A,int &heapsize){
	if(heapsize<1){
		cout<<"heap underflow"<<endl;
		return NULL;
	}
	int min=A[0];
	A[0]=A[heapsize-1];
	heapsize=heapsize-1;
	min_heapify(A,0,heapsize);
	return min;
}

void heap_decrease_key(int *A,int i,int key){
	if(key>A[i]){
		cout<<"new key is larger than current key"<<endl;
		return;
	}
	A[i]=key;
	int parent;
	while(i>0){
		parent=((i%2==0)?i/2-1:i/2);
		if(A[parent]>A[i]){
			exchange(A[parent],A[i]);
			i=parent;
		}
	}

}

// void min_heap_insert(vector<int> *A,int key,int &heapsize){
// 	A->push_back(0);
// 
// 
// 
// }
void print_heap(int *A,int heapsize){
	int k=0;int j;
	for(int i=0;i<log(heapsize+0.0)/log(2+0.0)+1;i++){
		for(j=0;j<pow(2+0.0,i+0.0);j++){
			if(k+j>=heapsize)break;
			cout<<A[k+j]<<" ";
			
		}
		k+=j;
		cout<<endl;
	}
}
int main(){

	int A[]={7,8,11,3,5,18,25,9};
	
	build_min_heap(A,8);
	print_heap(A,8);
	
	cout<<heap_minimum(A)<<endl;
	heap_decrease_key(A,2,1);
	print_heap(A,8);
	cout<<heap_minimum(A)<<endl;

	int i;
	cin>>i;



}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值