手写堆排序算法

本文介绍了堆排序算法,详细讲解了最小堆和最大堆的概念,以及如何利用数组表示堆。堆排序通过插入元素和删除元素的过程实现排序,其中插入是上移操作,删除是下移操作。文中还给出了C语言实现堆排序的代码示例。

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

堆排序算法,是通过堆这种数据结构来实现排序。

堆,其实就是二叉树。由于排序有从小到大、从大到小两种排序方式,对应的堆也分为最小堆和最大堆。

最小堆,就是一颗完全二叉树,每个节点都比其左子节点和右子节点小,整个树的根节点最小。
最大堆,就是一颗完全二叉树,每个节点都比其左子节点和右子节点大,整个树的根节点最大。


用一个连续的数组内存空间,就能表示堆。如下图所示:

 

​数组中每个元素,代表最小(大)堆中的一个节点,每个节点最多有两个子节点: 左子节点和右子节点。

上图中的箭头,是从父节点指向子节点,并且位置下标小的子节点为左子节点。
箭头,只是用来描述父子关系的含义,实际代码实现中,并不存在这个箭头,而是用节点在数组中的位置下标,就可以从父节点下标计算出子节点下标,反之,从子节点下标也能计算出父节点下标。

假设父节点位置下标为 idx_parent,左子节点位置下标为 idx_left, 右子节点位置下标为 idx_right:

从父节点下标,计算出子节点下标:
idx_left = idx_parent * 2 + 1;
idx_right = idx_parent * 2 + 2;


从子节点下标,计算出父节点下标:
idx_parent = (i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值