#include<stdio.h>
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}
void max_heapify(int a[],int i,int size) //用for循环来实现维护最大堆的性质
{
int l,r,largest;
int tmp,j;
for (j=i;j<=size;j=largest)
{
l=left(j);
r=right(j);
if (l<=size && a[l]>a[j])
largest=l;
else
largest=j;
if (r<=size && a[r]>a[largest])
largest=r;
if (largest!=j)
{
tmp=a[j];
a[j]=a[largest];
a[largest]=tmp;
}
else
break;
}
}
void max_heapifyr(int a[],int i,int size)
{
int l,r,largest;
int tmp;
l=left(i);
r=right(i);
if (l<=size && a[l]>a[i]) //先一左孩子结点比较
largest=l;
else
largest=i;
if (r<=size && a[r]>a[largest]) //前者比较中的较大者与右孩子结点比较,就可以得到三者中的最大者,位置存储在largest中
largest=r;
if (largest!=i) //如果左或者右孩子比i结点大,要相互交换,并且要继续递归左或者右孩子结点,直到最底部
{
tmp=a[i];
a[i]=a[largest];
a[largest]=tmp;
max_heapify(a,largest,size);
}
}
void build_max_heap(int a[],int len)
{
int i;
for( i=(len/2);i>=1;i--) //从最后一个不是叶子结点的开始建堆
max_heapify(a,i,len);
}
void heap_sort(int a[],int len)
{
int i,tmp;
build_max_heap(a,len); //建立最大堆
for (i=len;i>=2;i--) //从数组的最后一个开始排序
{
tmp=a[1];
a[1]=a[i];
a[i]=tmp;
max_heapify(a,1,i-1); //每次排完数组的数量减一个
}
}
int main()
{
int a[64];
int n,i;
printf("input the sum :\n");
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
heap_sort(a,n);
printf("the sorted is:\n");
for (i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
}
堆排序算法(c 语言实现)
最新推荐文章于 2023-05-15 11:23:12 发布