zoukankan      html  css  js  c++  java
  • 数据结构堆排序

    #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("
    ");
    		
    } 
    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;
    }

  • 相关阅读:
    C#第十六节课
    Hadoop系列(三):hadoop基本测试
    Hadoop系列(二):Hadoop单节点部署
    Hadoop系列(一):Hadoop集群搭建
    Stars project
    Tornado实现多进程/多线程的HTTP服务
    python paramiko模块
    爬虫代理
    tornado之用户验证装饰器
    tornado自定义session
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7099897.html
Copyright © 2011-2022 走看看