//,理解这个堆排序程序的关键在于理解函数
//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;
}