#include<stdio.h>
int heap_size; //建堆时参与的元素个数
int parent(int i); //三个节点关系函数
int left_child(int i);
int right_child(int i);
void max_heap(int *A,int i); //维护最大堆性质
void build_maxheap(int *A); //建立最大堆
int exchange(int *a,int *b);
int get_length(int *A); //获取数组中总的元素个数
int main()
{
int i;
int A[15]={17,86,8,111,48,44,99,1,24,68,34,19,96,33};
heap_size=get_length(A); //heap_size存储要排序的元素的个数,在建堆时比数组下标大1
build_maxheap(A);
for(i=heap_size-1;i>0;i--) //heap_size是数组中下标的最大值,即A[heap_size]是最后一个元素
{
exchange(A+i,A); //将最大值交换到数组末尾
heap_size--; //要处理的元素个数减1
build_maxheap(A); //维护剩余元素最大堆的性质
}
for(i=0;i<get_length(A);i++)
printf("%6d",A[i]);
}
void build_maxheap(int *A)
{
int i;
for(i=parent(get_length(A)-1);i>=0;i--) //从最后一个节点的parent开始建堆
max_heap(A,i);
}
void max_heap(int *A,int i)
{
int l,r,largest;
l=left_child(i);
r=right_child(i);
if(l<heap_size&&A[l]>A[i]) //为保证max_heap过程不会影响到已排序的部分,此处应判断左孩子是否小于heap_size
largest=l;
else largest=i;
if(r<heap_size&&A[r]>A[largest])
largest=r;
if(largest!=i)
{
exchange(A+i,A+largest);
max_heap(A,largest);
}
}
int parent(int i)
{
return (i-1)/2;
}
int left_child(int i)
{
return 2*i+1;
}
int right_child(int i)
{
return 2*i+2;
}
int exchange(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
return 0;
}
int get_length(int *A)
{
int len=0;
while(A[len]!='\0')
len++;
return len;
}
堆排序C语言代码
最新推荐文章于 2023-09-16 11:19:48 发布