C语言优先队列作用,优先队列(堆)的C语言实现以及堆排序

//,理解这个堆排序程序的关键在于理解函数

//void bubble_down(priority_queue *q,int p)

#include

#include

#define PQ_SIZE 16

typedef int item_type;

typedef struct

{

item_type q[PQ_SIZE+1]; //BODY of the queue

int n; //number of queue elements

}priority_queue;

void bubble_up(priority_queue *,int);

void bubble_down(priority_queue *,int);

void pq_swap(priority_queue *,int,int);

int pq_parent(int n)

{

if(n==1)

return (-1);

else

return ((int)n/2);

}

int pq_young_child(int n)

{

return (2*n);

}

void pq_insert(priority_queue *q,item_type x)

{

if(q->n >= PQ_SIZE)

printf("Warning:priority queue overflow insert

x=%d\n",x);

else

{

q->n=(q->n)+1;

q->q[q->n]=x;

bubble_up(q,q->n);

}

}

void bubble_up(priority_queue *q,int p)

{

if(pq_parent(p)==-1)

return;

if(q->q[pq_parent(p)] > q->q[p])

{

pq_swap(q,p,pq_parent(p));

bubble_up(q,pq_parent(p));

}

}

pq_init(priority_queue *q)

{

q->n=0;

}

void make_heap(priority_queue *q,item_type s[],int n)

{

int i;

pq_init(q);

for(i=0;i

pq_insert(q,s[i]);

}

item_type extract_min(priority_queue *q)

{

int min=-1;

if(q->n <= 0)

printf("Warning:empty priority queue.\n");

else

{

min=q->q[1];

q->q[1]=q->q[q->n];

q->n=q->n -1;

bubble_down(q,1);

}

return min;

}

void bubble_down(priority_queue *q,int p)

{

int c;

int i;

int min_index;

c=pq_young_child(p);

min_index=p;

for(i=0;i<=1;i++)

if((c+i)<=q->n)

{

if(q->q[min_index] > q->q[c+i])

min_index=c+i;

}

if(min_index!=p)

{

pq_swap(q,p,min_index);

bubble_down(q,min_index);

}

}

void heapsort(item_type s[],int n)

{

int i=0;

priority_queue q;

make_heap(&q,s,n);

for(i=0;i

s[i]=extract_min(&q);

}

void pq_swap(priority_queue *q,int p1,int p2)

{

item_type temp;

if(q->n<1)

printf("the priority queue is empty!");

temp=q->q[p1];

q->q[p1]=q->q[p2];

q->q[p2]=temp;

}

int main()

{

item_type

s[]={1,98,99,5,3,4,7,45,112,91,56,12,47,49,189,220};

priority_queue q;

int n=sizeof(s)/sizeof(item_type);

int i=0;

printf("the vector before sort is:\n");

for(i=1;i!=n;++i)

{

printf("%d\n",s[i]);

}

//heapsort(item_type s[],int n);

heapsort(s,n);

printf("the vector after sort is:\n");

for(i=1;i!=n;++i)

printf("%d\n",s[i]);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值