数据结构堆排序

来源:互联网 发布:软件公司财务报销制度 编辑:程序博客网 时间:2024/06/05 00:36
#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
原创粉丝点击