排序算法之堆排序

堆排序使用大顶堆,大顶堆的第一个元素是最大值,这样在排序的时候(假设共n个节点),直接将第一个元素和最后一个元素进行交换,然后从第一个元素开始进行向下调整至第n-1个元素。堆排序的步骤分为三步:
1、建堆(建大堆) 
2、交换数据
3、向下调整

 

/*******************
堆排序
***********************/
template<class T>
void HeapAdjust(T arr[],int index,int number)//调整堆,从而形成一个大顶堆
{
	int j = index*2 +1;//子节点
	while(j<number)
	{
		if (j+1<number && arr[j]<arr[j+1])//找到子节点中较大的一个
		{
			j++;
		}
		if (arr[index] >= arr[j])//父节点比子节点大,无需再继续比较
		{
			break;
		}
		swap(arr[index],arr[j]);
		index = j;
		j = 2*j +1;//查找下一层
	}
}

template<class T>
void HeapSort(T arr[],int length)
{
	int i;
	for (i=length/2-1;i>=0;i--)//创建大顶堆,只对有子节点的节点进行调整
	{
		HeapAdjust(arr,i,length);
	}
	for (i=length;i>=0;i--)
	{
		swap(arr[0],arr[i]);//将大顶堆的最大值放到队尾
		HeapAdjust(arr,0,i);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值