基于C语言的堆排序

->Gitee源码点击这里<-
有了向下调整算法和建堆算法的铺垫,我们就可以利用堆来堆数组排序了。
我们之前学过冒泡排序,而堆排序相比冒泡排序效率更高。
堆排序方思路:
a. 若想要将数组排成升序,则需要先将数组建立成大堆(降序则反之,这里以升序为例)
b. 下图是已经建好的一个堆
image.png
想要将数据排成升序,需要重复如下步骤:
①交换堆顶数据和最后一个数据
image.png
②交换过后,"删除"最后一个数据,这里的删除并不是真的删除,而是暂时的不允许访问该空间的值
堆使用数组表示的,访问数组元素需要通过下标,最大的下标值为(数组的长度-1),所以交换过后,我们只需暂时将size(数组长度)-1即可。
image.png
③此时剩下的数中,根节点为18,左子树和右子树任然是满足大堆关系,所以堆根节点18向下调整,使剩下的数成为大堆。
循环以上步骤,在此过程中,大的数不断地被排到后面,最终会形成升序排列

代码实现:
堆排是基于向下调整算法和建堆算法实现的,所以我们把上一篇中写好的代码copy过来

void Swap(int* a, int* b) //交换函数
{
   
	int tmp 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于最小堆的C语言堆排序算法可以通过以下步骤实现: 1. 首先,将无序序列构建成一个最小堆。可以使用一个循环遍历无序序列,从最后一个非叶子节点开始,依次向上调整每个子树,使得根节点的值小于等于其子节点的值。这个过程可以使用一个称为"shift_down"的函数来实现,它将根节点与其较小的子节点进行交换,然后继续向下调整交换后的子树。 2. 接下来,取出堆顶元素(即最小值),将其与最后一个元素交换位置,并将堆的大小减一。这样,最小值就被放置在了有序序列的末尾。 3. 此时,堆被破坏了,需要重新调整剩余元素构建一个新的最小堆。可以使用一个称为"shift_up"的函数来实现,它将新加入的元素与其父节点进行比较,如果父节点的值大于新加入的元素,则将它们交换位置,然后继续向上调整交换后的子树。 4. 重复步骤2和步骤3,直到堆的大小为1,此时整个序列就被排序完成了。 通过以上步骤,我们可以实现基于最小堆的堆排序算法。这个算法的时间复杂度仍为O(nlogn),并且相对于其他排序算法,堆排序只需要一个辅助存储空间,使其运行空间更小。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言实现基于最大堆和最小堆的堆排序算法示例](https://download.csdn.net/download/weixin_38500664/12796677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C语言堆排序算法详解](https://blog.csdn.net/weixin_58045538/article/details/121537268)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值