排序 —— 堆排序

一、算法介绍

  • 堆:堆是一种数据结构,可以把堆看成是一棵完全二叉树,这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小,则这样的堆称为大顶堆;若父亲小孩子大,则这样的堆称为小顶堆。
  • 堆化:以大顶堆为例,将当前结点(假设为a)的值与其孩子结点进行比较,如果存在大于 a 值的孩子结点,则从中选出最大的一个与a交换,当 a 来到下一层的时候重复上述过程,直到 a 的孩子结点的值都小于 a 的值为止。

二、算法思想

堆排序的执行过程描述(以大顶堆为例)如下:

  1. 建堆: 从无序序列所确定的完全二叉树的第一个非叶子结点开始,从右往左,由下往上,对每个结点进行堆化。
  2. 排序: 建堆结束之后,堆顶元素就是最大元素,我们将其和最后一个元素进行交换,那最大元素就放到了下标为 n 的位置,此时,无序序列的关键字减少1个,有序序列的关键字增加1个。然后,我们再对前面 n−1 个元素进行堆化,再将堆顶元素放到下标为 n−1 的位置。重复这个过程,直到堆中剩余一个元素,排序也就完成了。

三、算法过程

现在要完成6个整数 { 6,5, 14,7, 8, 1 } 的大顶堆排序

(1)建堆

  1. 调整14,14>1,满足堆定义,不需要调整。
  2. 调整5,5<7,5<8,不满足堆定义,故交换8和5,交换后5成为了叶子结点,故结束调整。
  3. 调整6,6<8,6<14,不满足堆定义,故交换6和14。继续调整6,6>1,满足堆定义,不需要调整
    在这里插入图片描述

(2)排序1

  1. 将堆顶14与最后一个元素1进行交换,无序序列的关键字减少1个,有序序列的关键字增加1个。
  2. 调整1,1<8,1<6,交换1和8。继续调整1,1>5,1>7,交换1和7,交换后1成为叶子结点,故结束调整
    在这里插入图片描述

(3)排序2

在这里插入图片描述

(4)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值