基于堆的优先队列

本文介绍了一个基于完全二叉树实现的优先队列,使用C语言编写。该优先队列通过自底向上和自顶向下的堆化操作维持最大堆属性,实现了插入和删除最大元素的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源代码如下


#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);
}


运行结果




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值