堆排序

堆排序是一种效率为O(nlgn)的排序算法,包括建堆和交换堆顶元素进行排序两个步骤。建堆时从最后一个子树往上调整,确保堆的性质;交换堆顶元素后,再进行重建堆的操作。堆排序过程涉及对数组的特定操作,以构建和维护堆结构。
摘要由CSDN通过智能技术生成

  堆排序分为两步:建初始堆和交换堆顶元素和末尾元素并重建堆( 排序)  时间复杂度为O(n) + O(nlgn)即等于O(nlgn)

一、建堆:时间复杂度:O(n) 

堆我们正好可以用一个数组来存储,那么它将有如下的关系:

i 表示第i个结点
parent = (i-1) / 2;
Lchild = 2*i + 1;
Rchild = 2*i + 2;

堆建立的时候有两点很重要:

1、必须从最后一个子树往上开始调整

2、每次调整都是从子树的根节点开始向下调整

堆排的代码如下:

//从某一个结点开始调整堆,可调整整个堆也可以调整部分堆,也就是说这个函数用于调整部分是满足堆的特性,部分不满足
void heapfiy(int *tree, int n, int i)//保证每一个子树都是堆(即符合堆的要求) //i表示是第i个结点,n表示结点的个数
{
	if(i > n) return ;
	int Lchild = 2*i + 1;  //下标
	int Rchild = 2*i + 2;
	int max = i;           //要在每个子树中先找到最大值,然后和根节点进行比较,max保存最大值结点的下标
	if(Lchild < n && tree[Lchild] > tree[max])
	{
		max = Lchild;
	}
	if(Rchild < n && tree[Rchild] > tree[max])
	{
		max = Rchild;
	}
	if(max != i)   
	{
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值