数据结构之堆排序C语言实现

堆排序:
时间复杂度:O(nlogn)
稳定性:不稳定
实现原理:将待排序的序列构造成一个大顶堆(或小顶堆) 整个序列的最大值就是堆顶的根节点,将它移走 (就是将其与对数组的末尾元素交换,此时末尾元素就是最大值)。然后将剩余的n-1个序列重新
构成一个堆,这样就会的到n个元素中 的最大值如此反复执行,得到一个有序序列。
大顶堆:根节点是最大者
小顶堆:根节点是最小者
大顶堆满足条件:K[i]>=K[2*i+1] 且K[i]>=K[2*i+2] (0<=i<=n/2-1) K[i]为堆顶 K[2*i+1]为堆顶左子树 K[2*i+2]为堆顶的右子树
小顶堆满足条件:K[i]<=K[2*i+1] 且K[i]<=K[2*i+2] (0<=i<=n/2-1)
实现步骤:
1.先将初始文件R[1..n]建成一个大顶堆,此堆为初始的无序区
2. 再将关键字最大的记录R1和无序区的最后一个记录R[n]交换,
3. 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
4. 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
5.然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,
6.由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,
7.同样要将R[1..

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值