堆排序是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一棵完全二叉树,根节点的值小于(或大于)两个子节点的值,同时根节点的两个子树也分别是一个堆。堆排序主要包括两个过程:一是构建堆,二是交换堆顶元素与最后一个元素的位置。
#include <stdio.h>
void DisArray(int a[],int n);
void AdjustHeap(int a[],int s,int m);
void CreateHeap(int a[],int n);
void HeapSort(int a[],int n);
int main()
{
int a[]={67,48,23,81,38,19,52,40};
int n=sizeof(a)/sizeof(a[0]);
printf("排序前:");
DisArray(a,n);
HeapSort(a,n);
printf("排序后:");
DisArray(a,n);
return 0;
}
void DisArray(int a[],int n)//打印
{
int i;
for(i=0;i<n;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
void CreateHeap(int a[],int n)//创建堆
{
int i;
for(i=n/2-1;i>=0;i--)
{
AdjustHeap(a,i,n-1);
}
}
void AdjustHeap(int a[],int s,int m)//调整堆
{
int t,j;
t=a[s];
for(j=2*s+1;j<=m;j*=2+1)
{
if(j<m&&a[j]<a[j+1])
{
j++;
}
if(t>a[j])
{
break;
}
else
{
a[s]=a[j];
s=j;
}
}
a[s]=t;
}
void HeapSort(int a[],int n)
{
int t,i;
CreateHeap(a,n);
for(i=n-1;i>0;i--)
{
t=a[0];
a[0]=a[i];
a[i]=t;
printf("第%d趟排序结果:",n-1);
DisArray(a,n);
AdjustHeap(a,0,i-1);
}
}