C++排序算法之堆排序

本文详细介绍了C++中的堆排序算法。通过调整过程,解释了如何保持堆的性质,确保排序正确进行。在调整过程中,当节点不满足最大堆(或最小堆)条件时,会与较大(或较小)的孩子节点交换,直至整个序列形成有序堆。
摘要由CSDN通过智能技术生成
堆排序算法

1、算法介绍
     堆是一种数据结构,可以把堆看成一棵完全二叉树,这可完全二叉树满足:任何一个非叶子结点的值都不大于(或者不小于)其左右孩子结点的值。若父亲大孩子小,则叫做大顶堆,若父亲小孩子大,则叫做小顶堆。
     根据堆的定义知道,代表堆的这棵完全二叉树的根结点的值是最大(或最小)的,因此将一个无序序列调整为一个堆,就可以找出这个序列的最大(或最小)值,然后将找出的这个值交换到序列的最后(或最前),这样有序序列元素增加1个,无序序列元素减少1个,对新的无序序列重复这样的操作,就实现了排序。这就是堆排序的思想。
     堆排序最关键的操作就是将序列调整为堆的过程。整个排序过程就是通过不断调整使得不符合堆定义的完全二叉树变为符合堆定义的完全二叉树的过程。
2、执行过程
例如:
原始序列: 49  38  65  97  76 13  27  49
(1)建堆
     先将这个序列调整为一个大顶堆。原始序列对应的完全二叉树如下图所示

在这个完全二叉树中,结点76、13、27、49是叶子结点,它们没有左右孩子,所以它们满足堆的定义。从97开始,按照97、65、38、49的顺序依次调整。
  1. 调整97。97>49,所以97和它的孩子49 满足堆的定义,不需要调整。
  2. 调整65。65>13,65>27,所以65和它的孩子13、27满足堆的定义,不需要调整。<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值