#include <stdio.h>
void HeapAdjust(int a[],int i,int size);
void BuildHeap(int a[],int size);
void HeapSort(int a[],int size);
void Swap(int *p,int *q);
int main(){
int i,n,a[100];
printf("堆排列:\n");
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
HeapSort(a,n);
printf("排序结果:\n");
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void HeapAdjust(int a[],int i,int size){
int lchild=2*i,rchild=2*i+1;
int max=i;
if(i<=size/2){
if(lchild<=size&&a[lchild]>a[max]){
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max]){
max=rchild;
}
if(max!=i){
Swap(&a[i],&a[max]);
HeapAdjust(a,max,size);
}
}
}
void BuildHeap(int a[],int size){
int i;
for(i=size/2;i>=1;i--){
HeapAdjust(a,i,size);
}
}
void HeapSort(int a[],int size){
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--){
Swap(&a[1],&a[i]);
HeapAdjust(a,1,i-1);
}
}
void Swap(int *p,int *q){
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void HeapAdjust(int a[],int i,int size);
void BuildHeap(int a[],int size);
void HeapSort(int a[],int size);
void Swap(int *p,int *q);
int main(){
int i,n,a[100];
printf("堆排列:\n");
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
HeapSort(a,n);
printf("排序结果:\n");
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void HeapAdjust(int a[],int i,int size){
int lchild=2*i,rchild=2*i+1;
int max=i;
if(i<=size/2){
if(lchild<=size&&a[lchild]>a[max]){
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max]){
max=rchild;
}
if(max!=i){
Swap(&a[i],&a[max]);
HeapAdjust(a,max,size);
}
}
}
void BuildHeap(int a[],int size){
int i;
for(i=size/2;i>=1;i--){
HeapAdjust(a,i,size);
}
}
void HeapSort(int a[],int size){
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--){
Swap(&a[1],&a[i]);
HeapAdjust(a,1,i-1);
}
}
void Swap(int *p,int *q){
int temp;
temp=*p;
*p=*q;
*q=temp;
}