囧~原来优先队列可以实现堆排序~
弄了个优先队列代码~结果发现它竟然无意中实现了堆排序的功能~堆排序折腾了我些许时间理解~写了优先队列后感觉对堆排序理解容易多了……
问题是堆排序记得要用到递归而优先队列不用……那么优先队列和堆排序还有密切的关系么~
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> #include<time.h> #define MAX_LENGTH 128 #define OK 1 #define ERROR 0 typedef int ElemType; typedef struct Priority_Queue { int length; size_t size; ElemType* ElemType; }Priority_Queue,*P_Priority_Queue; void Creat_Node(void** p,const size_t size); void Free_Node(void** p); void Initilaze_Priority_Queue(P_Priority_Queue queue); //初始化一个优先队列 void Free_Priority_Queue(P_Priority_Queue queue); //释放一个优先队列 void Insert_Priority_Queue(P_Priority_Queue queue,ElemType* e); //插入一个元素 void Get_Priority_Queue(P_Priority_Queue queue,ElemType* e); //获取顶部的一个元素 void Del_Priority_Queue(P_Priority_Queue queue,ElemType* e); //获取顶部并删除一个元素 int IsFull_Priority_Queue(P_Priority_Queue queue); //判断是否满表 int IsEmpty_Priority_Queue(P_Priority_Queue queue); //判断是否空表 int main() { Priority_Queue queue={0}; ElemType e=0; int i=0; srand((unsigned)time(NULL)); Initilaze_Priority_Queue(&queue); puts("测试数据:\n"); for (i=0;i<10;++i) { e=rand()%100; printf("%-4d",e); Insert_Priority_Queue(&queue,&e); } puts("\n\n堆内数据排列:\n\n"); for (i=1;i<=queue.length;++i) printf("%-4d",queue.ElemType[i]); puts("\n\n获取并删除堆顶数据:\n"); while (IsEmpty_Priority_Queue(&queue)==OK) { Del_Priority_Queue(&queue,&e); printf("%-4d",e); } puts(""); Free_Priority_Queue(&queue); return 0; } void Creat_Node(void** p,const size_t size) { if (*p) return ; *p=malloc(size); assert(*p); memset(*p,0,sizeof(size)); } void Free_Node(void** p) { if (*p==NULL) return ; free(*p); *p=NULL; } void Initilaze_Priority_Queue(P_Priority_Queue queue) { Creat_Node((void** )&queue->ElemType,MAX_LENGTH*sizeof(ElemType*)); queue->size=sizeof(*queue->ElemType); } void Free_Priority_Queue(P_Priority_Queue queue) { Free_Node((void** )&queue->ElemType); } void Insert_Priority_Queue(P_Priority_Queue queue,ElemType* e) { int i=0; if (IsFull_Priority_Queue(queue)==ERROR) return ; for (i=++queue->length;*e<queue->ElemType[i>>1]&&i>>1>0;i>>=1) queue->ElemType[i]=queue->ElemType[i>>1]; queue->ElemType[i]=*e; } void Get_Priority_Queue(P_Priority_Queue queue,ElemType* e) //获取顶部的一个元素 { *e=queue->ElemType[1]; } void Del_Priority_Queue(P_Priority_Queue queue,ElemType* e) //获取顶部并删除一个元素 { int i=1; int k=2; int temp=queue->ElemType[queue->length]; if (IsEmpty_Priority_Queue(queue)==ERROR) { *e=NULL; return ; } for (*e=queue->ElemType[1],--queue->length;k<=queue->length;i=k,k<<=1) { if (k+1<=queue->length&&queue->ElemType[k+1]<queue->ElemType[k]) ++k; if (temp<queue->ElemType[k]) break; queue->ElemType[i]=queue->ElemType[k]; } queue->ElemType[i]=temp; } int IsFull_Priority_Queue(P_Priority_Queue queue) //判断是否满表 { if (queue->length>MAX_LENGTH-2) return ERROR; return OK; } int IsEmpty_Priority_Queue(P_Priority_Queue queue) //判断是否空表 { if (queue->length==0) return ERROR; return OK; }
[此贴子已经被作者于2017-9-20 22:43编辑过]