c++实现二叉堆及堆排序

一、什么是二叉堆

       二叉堆在数据结构上是完全二叉树。完全二叉树即:除了最后两层的节点外,所有节点具有两个子节点的二叉树。最底层的数据按照从左到右依次排列。

同时,节点满足:父节点存储的值总是大于或者总是小与子节点的存储的值。

最大堆:父节点的键值总是大于或等于任何一个子节点的键值。

最小堆:父节点的键值总是小于或等于任何一个子节点的键值。

如下图所示,图a是一个二叉堆,而图b不是。


                                            图a


                                                 图b


二、二叉堆的特点

   因为完全二叉树的特殊性,可以使用数组来存储而不用链式存储。如下图2所示,图2(a)中的数组对应图(b)中的二叉堆。



从图中可以看出:数组中i元素对应的左子树在数组的2i的位置上,右子树在2i+1的位置上,其父亲在floor(i/2)的位置上。

利用该特性很容易在用数组存储的二叉堆中找出一个节点的左右子树和父亲节点。


三、c++实现二叉堆的基本操作

       二叉堆的一切操作建立与堆中父节点存储的值总是大于或者总是小与子节点的存储的值。以下我们均讨论的是父亲节点存储的值小与子节点存储的值的情况。

1、二叉堆的数据结构定义 

BinaryHeap.h文件:

#include <vector>
using std::vector;
template < typename T>
class BinaryHeap {
public:
    BinaryHeap (int capacity = 100) ;
    BinaryHeap (vector<T> &item) ;
    ~BinaryHeap(){}
    bool isEmpty ();
    void insert (const T & x);
    void deleteMin ();
    void deleteMin (T & minItem);
    void makeEmpty ();
    void showHeap();
private:
    int currentSize;
    vector<T> array;
    void percolateDown (int hole);
    void buildHeap ();
};

2、二叉堆的插入

       向二叉堆中插入一个数需要保持二叉堆的特性。首先,

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值