排序-堆排序-数据结构(32)

本文介绍了堆的概念及其作为完全二叉树的特点,并详细解析了如何通过堆调整算法解决堆排序中的两大核心问题:一是如何从无序序列中建立一个堆;二是如何在输出堆顶元素后,将剩余元素调整成新的堆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、堆的定义

n[i]<=n[2i] && n[i]<=n[2i+1]。其实堆的概念就是完全二叉树了。i结点的左孩子结点是2i,右孩子是2i+1。

二、解决堆所面临的两个问题

1、//问题一:无序序列建立一个堆

void HeapSort(){
	//建成了堆 
	for (int i = length/2; i > 0; --i)
	{
		//从非终端结点开始筛选
		HeapAdjust(i,length);
	}
	for (int i = length; i>1; --i)
	{
		//输出堆顶元素 然后进行筛选
		Swap(1,i);
		//对剩下的进行筛选
		HeapAdjust(1,i-1);
	}
}

2、/问题二:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆

void HeapAdjust(int s,int m){
	int rc = sqTable[s];
	for (int j= 2*s ; j <= m; j*=2)
	{
		if (j<m&& sqTable[j]<sqTable[j+1])
		{
			j++;//j为儿子中较大的下标
		}
		if (rc < sqTable[j])
		{
			break;
		}
		//往下移动一格
		sqTable[s] = sqTable[j];
		s = j;
	}
	sqTable[s] = rc;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值