数据结构-队列的堆排序

队列中的数据设为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;
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_40251838/article/details/80548762
今日推荐