数据结构堆排序

#include <iostream>
#include<stdlib.h>

// 创建一个结构体 
typedef struct node{
	int data;
	struct node *left,*right;
}BiTreeNode;  

int rear=0,front=0;//全局变量 

//创建完全二叉树 
BiTreeNode *CreateBiTree(int a[],BiTreeNode **Q,int n){
	
	BiTreeNode *root,*p,*t=NULL;
	int i;
	//先把根节点创建出来 
	root=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	root->data=a[0];
	root->left=root->right=NULL;
	
	Q[++rear] = root;//新增加的
	for(i=1;i<n;i++){	    
       p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
       p->left=p->right=NULL;
	   p->data=a[i];
	   if(t==NULL)
	     t=Q[++front];
	   //if(!t)
	      //p=t->left;
		if(!t->left)
		  t->left = p;
	   else
	      //p=t->right;
		  if (!t->right){
		  t->right = p;
		  t=NULL;	
	      }
	     //p=Q[++rear];
		  Q[++rear] = p;
	}
	
	return root;	
}
//void Adjust(BiTreeNode *root,BiTreeNode **Q){
void Adjust(BiTreeNode **Q){	
	int k,flag=0,m;
	BiTreeNode * t;
	while(1){
		k=front;
		flag=0;
	    while(k>0){
	    	t=Q[k];
			
	    	//if(t->data > t->left->data){
	    	if(t->data < t->left->data){
				m=t->data;
	    		t->data=t->left->data;
	    		t->left->data=m;
	            flag=1;
	    	}
			
	    	//if(!t->right&&t->data > t->right->data){
			if(t->right&&t->data < t->right->data){
	    	
				m=t->data;
	    		t->data=t->right->data;
	    		t->right->data=m;
	            flag=1;
	    	}
			
	    	k--;
	    }
	    if(!flag)
	    break;
	}	
	
}
void printBiTree(BiTreeNode **Q,int n){
	
	int i;
	
	//for(i=n-1;i>0;i--)
	for (i = n; i > 0; i--)
	   printf("%d  ",Q[i]->data);
	printf("\n");
		
} 
int main(int argc, char** argv) {
	 int a[8]={3,2,5,8,4,7,6,9};
	 int m;  // 用来交换 
	  
	 BiTreeNode **Q,*root;
	 
	 Q=(BiTreeNode **)malloc(9*sizeof(BiTreeNode *));
	 //创建完全二叉树 
	 root=CreateBiTree(a,Q,8);
	 
	 //调整成大根堆
	 
	 Adjust(Q);  
	
	 while(rear > 1){
	 	m=Q[rear]->data;
	 	Q[rear]->data=Q[1]->data;
	 	Q[1]->data=m;
	 	
	 	rear--;  // 砍掉叶子 
	 	if(Q[front]->right)
	 	  // Q[rear]->right=NULL;
		  Q[front]->right = NULL;
	 	else{
	 		Q[front]->left=NULL;
	 			front--;
	 	}
		Adjust(Q);//新增加的
	 }
	 //输出
	 
	 printBiTree(Q,8);
	 	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值