利用优先队列实现堆排序(自顶向下自底向上堆化完全二叉树的运用)

本文介绍了如何利用优先队列实现堆排序,重点探讨了自顶向下和自底向上的两种完全二叉树堆化方法。通过源代码展示,解释了这两种方法的工作原理,并给出了程序的运行结果。
摘要由CSDN通过智能技术生成

源代码如下:


#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 PQinit(int maxN){
	pq = (node)malloc(maxN*sizeof(node));
	N = 0;
}

int PQempty(){
	return N==0;
}
void PQinsert(Item v){
	pq[N++] = v;
}
Item PQdelmax(){
	int j , max = 0;
	for(j=1;j<N;j++)
		if(pq[max].data<pq[j].data) max = j;
	swap(pq[max],pq[N-1]);
	return pq[--N];
}

//自底向上堆化 完全二叉树 父节点的关键值大于等于子节点关键值 
void fixUp(Item a[],int k){  //k表示破坏堆规则的位置 
	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++; //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值