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

源码例如以下:


#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表示破坏堆规则keyword的位置 ,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 headSort(Item a[],int l,int r){
	int k , num = r-l+1;
	Item *b = a+l-1;
	for(k = num/2;k>=1;k--)
		fixDown(b,k,num);//初始化堆结构 
	while(num>1){
		swap(b[1],b[num]);
		fixDown(b,1,--num); //每删除一个最大值keyword。修正堆结构 
	}
}


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,k ;
	for(j=1;j<=7;j++)
		printf("%d ",a[j].data);
	printf("

排序后

");
	headSort(a,1,8);
	for(k=1;k<=7;k++)
		printf("%d ",a[k].data);
}



程序执行结果


原文地址:https://www.cnblogs.com/jzssuanfa/p/7141301.html