堆排序

铺垫一下:

首先聊下什么是“堆”,堆其实是一个“完全二叉树”,而且是一个有特殊规则的完全二叉树,可以分为“大顶堆”和“小顶堆”,大顶堆特点是根节点比其左右节点都要大,而小顶堆与其相反。


思路:

首先建立最大堆,然后依次交换根节点与最后一个元素,依次删除最后一个元素,重新建立最大堆。

注意:根节点是从0开始计数。

void swap(int *a,int *b)
{
	int t=*a;
	*a=*b;
	*b=t;
}
void PercDown(int A[],int p,int N)
{//将N个结点以p为根节点的堆调整为最大堆;
//此时堆根节点从0开始计数;
	int parent,child;
	int X;	
	X=A[p];
	for(parent=p;(parent*2+1)<N;parent=child)
	{
		child=parent*2+1;
		if((child!=N-1)&&A[child]<A[child+1])
			child++;
		if(X>=A[child]) break;
		else
			A[parent]=A[child];
	}
	A[parent]=X;
	
}

void Heap_sort(int A[],int N)
{
	int i;
	for(i=N/2-1;i>=0;i--)
		PercDown(A,i,N);
	for(i=N-1;i>=0;i--)
	{
		swap(&A[0],&A[i]);
		PercDown(A,0,i);
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值