队列中的数据设为10个,这十个数用 srand(time(0));data=rand()%101;的方法取100以内的随机数。
随后进行堆排序。输出堆排序过程中每个调整堆。
程序代码如下(有点冗长,但是运行无误):
#include"stdio.h" #include"stdlib.h" #include"conio.h" #include"time.h" //一定不要忘了用下角标啊aAAAAAa int N=11; typedef struct QNode{ int data; struct QNode *next; }QNode,*QPtr; typedef struct{ QPtr front; QPtr rear; }LinkQueue; void InitQueue(LinkQueue &Q) //创建一个队列 { QPtr Q2; int i=0; Q.front =Q.rear =(QPtr)malloc(sizeof(QNode)); if(!Q.front ) printf("储存分配失败!!!\n"); else Q.front->next =NULL; srand(time(0)); while(i<N) { Q2=(QPtr)malloc(sizeof(QNode)); if(!Q2) printf("储存分配失败!\n"); i++; Q2->data =rand()%101; Q2->next =NULL; Q.rear->next=Q2; Q.rear =Q2; } } void Adjust(LinkQueue &Q,int n) //堆调整 { int i,j,max; int a,b,c; QPtr qp; qp=(QPtr)malloc(sizeof(QNode)); if(!qp) printf("储存分配失败!\n"); if(n%2==1){ //如果n为奇数 具体注释见偶数 i=n/2; while(i>0) { max=0; j=0; qp=Q.front; while(j<i) { qp=qp->next; j++; } a=qp->data; j=0; qp=Q.front; while(j<(2*i+1)) { qp=qp->next; j++; } b=qp->data; j=0; qp=Q.front; while(j<2*i) { qp=qp->next; j++; } c=qp->data; if(a>max) max=a; if(b>max) max=b; if(c>max) max=c; if(max==b) { qp=Q.front; j=0; while(j<(2*i+1)) { qp=qp->next; j++; } qp->data=a; j=0; qp=Q.front; while(j<i) { qp=qp->next; j++; } qp->data=b; } if(max==c&&b!=max) { j=0; qp=Q.front; while(j<2*i) { qp=qp->next; j++; } qp->data=a; j=0; qp=Q.front; while(j<i) { qp=qp->next; j++; } qp->data=c; } i--; } } if(n%2==0) //如果n为偶数 { i=n/2-1; while(i>0&&n!=2) //堆调整 使无序组第一个元素为最大值 { max=0; j=0; qp=Q.front; //找到ki的值 while(j<i) { qp=qp->next; j++; } a=qp->data; j=0; qp=Q.front; //找到k(2i+1) 的值 while(j<(2*i+1)) { qp=qp->next; j++; } b=qp->data; j=0; qp=Q.front; //找到k(2i)的值 while(j<2*i) { qp=qp->next; j++; } c=qp->data; if(a>max) max=a; //求出三者中最大值 if(b>max) max=b; if(c>max) max=c; if(max==b) //如果最大值为k(2i+1) 与ki交换值 { qp=Q.front; j=0; while(j<(2*i+1)) { qp=qp->next; j++; } qp->data=a; j=0; qp=Q.front; while(j<i) {qp=qp->next; j++;} qp->data=b; } if(b!=max&&max==c) //同上一步 { j=0; qp=Q.front; while(j<2*i) {qp=qp->next; j++;} qp->data=a; j=0; qp=Q.front; while(j<i) { qp=qp->next; j++;} qp->data=c; } i--; } j=0; //最后将kn和k1进行比较 qp=Q.front; while(j<n){ qp=qp->next; j++; } if(qp->data > Q.front->next->data) { a=qp->data; qp->data=Q.front->next->data; Q.front->next->data=a; } } } void Sort(LinkQueue &Q,int n) //堆调整后的排序 { int a,b; int i=0; QPtr qp; qp=(QPtr)malloc(sizeof(QNode)); if(!qp) printf("储存分配失败!\n"); Adjust(Q,n); //调整堆 printf("调整堆:"); //输出堆的调整结果 qp=Q.front; while(qp!=Q.rear) { qp=qp->next; printf("%d ",qp->data); } printf("\n"); a=Q.front->next->data; //将堆调整后的无序组的第一个元素放入后面的有序组 qp=Q.front; while(i<n) { qp=qp->next; i++; } b=qp->data; qp->data=a; Q.front->next->data=b; if(n-1>1) //递归 Sort(Q,n-1); } int main() { QPtr qp; qp=(QPtr)malloc(sizeof(QNode)); if(!qp) printf("储存分配失败!\n"); LinkQueue Q; InitQueue(Q); qp=Q.front; printf("原始队列:\n"); while(qp!=Q.rear) { qp=qp->next; printf("%d ",qp->data); } printf("\n"); Sort(Q,N); qp=Q.front; printf("\n排序后的队列为:\n"); while(qp!=Q.rear) { qp=qp->next; printf("%d ",qp->data); } return 0; }
运行结果如下: