算法导论-----最大优先队列

本文介绍了一种最大优先队列的实现方法,包括插入、提取最大元素等操作,并提供了完整的C语言代码示例。

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

#define INIT_NUMBER 2
int reserve_number = 100;
int heap_size;
int length;

typedef  struct pair
{
	int key;
	int value;
}PAIR,*PAIRPOINT;

//往最大优先队列中添加根结点
void MAX_HEAPIFY_ROOT(PAIR* A,int i)
{
	int left=2*i+1;
	int right=left+1;
	int largest;

	if(left<=heap_size&&A[left].key>A[i].key)
	{
		largest=left;
	}
	else
	{
		largest=i;
	}

	if(right<=heap_size&&A[right].key>A[largest].key)
	{
		largest=right;
	}

	if(largest!=i)
	{
		PAIR max;
		max=A[largest];
		A[largest]=A[i];
		A[i]=max;

		MAX_HEAPIFY_ROOT(A,largest);
	}
}

往最大优先队列中添加叶子结点
void MAX_HEAPIFY_CHILD(PAIR* A,int i)
{
	int  parent=(i-1)/2;
	int  small;

	if(parent>=0&&A[parent].key<=A[i].key)
	{
		small=parent;
	}
	else
	{
		small=i;
	}

	if(small!=i)
	{
		PAIR min;
		min=A[parent];
		A[parent]=A[i];
		A[i]=min;

		MAX_HEAPIFY_CHILD(A,small);
	}
}


//创建最大优先队列
void BUILD_MAX_HEAP(PAIR* A)
{
	heap_size=length;

	for(int i=length/2;i>=0;--i)
	{
		MAX_HEAPIFY_ROOT(A,i);
	}
}

//返回A中具有最大关键字的元素
PAIR MAXIMUM(PAIR *A)
{
	if(heap_size<0)
		exit(0);

	return A[0];
}

//返回并删除A中具有最大关键字的元素
PAIR EXTRACT_MAX(PAIR *A)
{
	if(heap_size<0)
	{
		printf("A为空\n");
		//结束当前进程
		exit(0);
	}
	else
	{
		PAIR max;
		max=A[0];
		A[0]=A[heap_size];
		heap_size=heap_size-1;

		MAX_HEAPIFY_ROOT(A,0);

		return max;
	}
	
}

//往最大优先队列中添加一个元素i
void INSERT(PAIR *A,PAIR i)
{
	length=heap_size=heap_size+1;
	if(heap_size>=reserve_number)
	{
		reserve_number=reserve_number+100;
		A=(PAIR *)realloc(A,reserve_number*sizeof(PAIR));
	}
	if(!A)
	{
		printf("内存分配失败\n");
		return ;
	}
	A[heap_size]=i;
	MAX_HEAPIFY_CHILD(A,heap_size);
}

int _tmain(int argc, _TCHAR* argv[])
{
	heap_size=length=INIT_NUMBER;

	PAIR *A=(PAIR *)malloc((reserve_number)*sizeof(PAIR));
	if(!A)
	{
		printf("内存分配失败\n");
		return  1;
	}
	A[0].key=0;
	A[0].value=-0;
	A[1].key=1;
	A[1].value=-1;
	A[2].key=2;
	A[2].value=-2;

	BUILD_MAX_HEAP(A);


	PAIR x;
	x.key=8;
	x.value=10;
	INSERT(A,x);


	for(int i=0;i<4;++i)
	{
		printf("%d\n",EXTRACT_MAX(A));
	}

	free(A);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值