堆排序
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *left,*right;
}BTNode;
BTNode *CreateWanTree(int a[],int n);
void Forder(BTNode *root);
void DuiSort(BTNode *root,int n);
int main(void){
int a[9]={3,2,5,8,4,7,6,9,1};
BTNode *root;
//创建完全二叉树
root=CreateWanTree(a,9);
// Forder(root);
// printf("\n");
//堆排序
DuiSort(root,9);
}
BTNode *CreateWanTree(int a[],int n){
BTNode *root;
BTNode *p,*pa;
BTNode **Q;
int i,front,rear;
Q=(BTNode **)malloc((n+2)*sizeof(BTNode *));
front=rear=0;
//创建根结点
pa=root=(BTNode *)malloc(sizeof(BTNode));
root->data=a[0];
root->left=root->right=NULL;
//创建其他结点
for(i=1;i<n;i++){
p=(BTNode *)malloc(sizeof(BTNode));
p->data=a[i];
p->left=p->right=NULL;
if(!pa->left)
pa->left=p;
else{
pa->right=p;
pa=Q[++front]; //出队一个双亲
}
Q[++rear]=p;
}
free(Q);
return root;
}
void Forder(BTNode *root){
if(root){
printf("%5d",root->data);
Forder(root->left);
Forder(root->right);
}
}
void DuiSort(BTNode *root,int n){
//创建初始化队列
BTNode ** Q;
BTNode *p,*pmin;
int front,rear;
int end;
int tag,k,t,ta;
Q=(BTNode **)malloc((n+2)*sizeof(BTNode *));
//根入队
front=rear=0;
Q[++rear]=root;
//其他结点入队
while (1){
p=Q[++front];
if(p->left==NULL&&p->right==NULL)
break;
else{
if(p->left)
Q[++rear]=p->left;
if(p->right)
Q[++rear]=p->right;
}
end=rear;
}
//调整
//循环体控制
while(front>1){
//调整
while(1){
//设定标志
tag=1;
for(k=front-1;k>0;k--){
p=Q[k];
pmin=p;
if(p->data>p->left->data)
pmin=p->left;
if(p->right){
if(pmin->data > p->right->data){
pmin=p->right;
}
}
if(p-pmin){
t=p->data;
p->data=pmin->data;
pmin->data=t;
tag=0;
}
}
if(tag)
break;
}
//交换
//root和第一个数均可以
//ta=Q[k+1]->data;
//Q[k+1]->data=Q[rear]->data;
//Q[rear]->data=ta;
ta=root->data;
root->data=Q[rear]->data;
Q[rear]->data=ta;
if(Q[front-1]->right)
Q[front-1]->right=NULL;
else{
Q[front-1]->left=NULL;
front--;
}
rear--;
}
for(;end>0;end--){
printf("%5d",Q[end]->data);
}
}