码迷,mamicode.com
首页 > 其他好文 > 详细

基于堆的优先队列

时间:2015-08-17 19:42:34      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:   优先队列   

源代码如下


#include <stdio.h>
#include <stdlib.h>
typedef struct Item *node;
struct Item{
	int data;
	char c;
};
static Item *pq;
static int N ;
void swap(Item &a,Item &b){struct Item t = a;a = b;b = t;}
//自底向上堆化 完全二叉树 父节点的关键值大于等于子节点关键值 
void fixUp(Item a[],int k){  //k表示破坏堆规则的位置  O(NlgN) 
	while(k>1 && a[k/2].data < a[k].data){
		swap(a[k],a[k/2]);
		k = k/2;
	}
} 
//自顶向下堆化 
void fixDown(Item a[],int k,int n){  //k表示破坏堆规则关键字的位置 ,n为堆的大小
	int j; 
	while(2*k<=n ){
		j = 2*k;
		if(j<n && a[j].data<a[j+1].data)j++; //处理好啦K处节点只有一个子节点的情况 
		if(a[k].data>=a[j].data)break;
		swap(a[k],a[j]);
		k = j;
	}
} 
void PQinit(int maxN){
	pq = (node)malloc((maxN+1)*sizeof(node));
	N = 0;
}
int PQempty(){
	return N==0;
}
void PQinsert(Item v){
	pq[++N] = v;  //pq[0]未用,在某些实现中可以当作观察哨。 
	fixUp(pq,N);
}
Item PQdelmax(){
	swap(pq[1],pq[N]);
	fixDown(pq,1,N-1);
	return pq[N--];
}
main(){
	PQinit(40);
	struct Item a[8] = {{0,'0'},{7,'c'},{95,'c'},{12,'c'},{96,'c'},{76,'c'},{36,'c'},{46,'c'}};
	int j ;
	for(j=1;j<=7;j++) PQinsert(a[j]);
	printf("生成的堆有序的完全二叉树结构\n"); 
	for(j=0;j<7;j++)
		printf("%d\n",pq[j+1].data);
	printf("逐渐取出优先队列的最大值\n");
	for(j=0;j<7;j++)
		printf("%d\n",PQdelmax().data);
}


运行结果


技术分享


版权声明:本文为博主原创文章,未经博主允许不得转载。

基于堆的优先队列

标签:   优先队列   

原文地址:http://blog.csdn.net/wen942467928/article/details/47728067

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!