您的位置:首页 > 其它

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

2015-08-17 17:26 375 查看
源代码如下:

#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++; //处理好啦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); //每删除一个最大值关键字,修正堆结构
}
}

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("\n\n排序后\n\n");
headSort(a,1,8);
for(k=1;k<=7;k++)
printf("%d ",a[k].data);
}


程序运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: