1.堆排序是在完全二叉树的基础上进行的
2.堆排序的步骤:
*将这个完全二叉树调整为一个大根堆(小根堆)
*交换最后一个结点和根结点数据域的值
*将最后一个结点排除在下一次的排序之中,即砍掉最后一个结点
完全二叉树的创建(借助队列):
BinaryNode* CreateBinaryTree(int a[],int n,BinaryNode** CT){
BinaryNode* root=NULL;
int i;
int rear,front;
front=rear=0;
for(i=0;i<n;i++){
CT[++rear]=(BinaryNode*)malloc(sizeof(BinaryNode));
CT[rear]->data=a[i];
CT[rear]->left=CT[rear]->right=NULL;
if(root==NULL)
root=CT[rear];
else{
if(rear%2)
CT[rear/2]->right=CT[rear]; //如果rear为奇数,则是当前父结点的右儿子
else
CT[rear/2]->left=CT[rear]; //如果rear为偶数,则是当前父结点的左儿子
}
}
return root;
}
堆排序:
void HeapSort(BinaryNode** CT,int rear){
int front;
int tag,t;
int r;
front=0;
while(rear!=front+1){ //若只剩余一个结点,则结束排序
tag=1;
while(tag){ //调整为大根堆
tag=0;
for(r=rear;r>front+1;r--){ //将每一个儿子结点与其相应的父结点的数据域进行比较
if(CT[r]->data<CT[r/2]->data){
t=CT[r]->data;
CT[r]->data=CT[r/2]->data;
CT[r/2]->data=t;
tag=1;
}
}
}
t=CT[front+1]->data; //交换根结点和最后一个结点的数据域的值
CT[front+1]->data=CT[rear]->data;
CT[rear]->data=t;
rear--; //砍掉最后一个结点
}
}