队列中的数据设为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;
}
运行结果如下: