堆排序C语言代码

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值