• 数据结构(8) -- 堆


    //MaxHeap.h
    #ifndef MAXHEAP_H_
    #define MAXHEAP_H_
    #define ElementType int
    #define MAXDATA 1000
    
    class MaxHeap
    {
    private:
        ElementType *elem;
        int size;
        int capacity;
    public:
        MaxHeap();  //默认构造函数
        MaxHeap(int MaxSize); //构造一个大小为MaxSize*ElementTye的堆
        ~MaxHeap();    //释放elem
        bool IsFull(); //判断堆是否已满
        bool IsEmpty();     //判断堆是是否为空
        void Insert(ElementType item); //往插入元素
        ElementType DeleteMax(); //删除堆中最大元素
        void print();  //打印堆元素
    };
    
    #endif
    
    
    //MaxHeap.cpp
    #include "MaxHeap.h"
    #include <iostream>
    
    MaxHeap::MaxHeap()
    {
        int MaxSize = 100;
        elem = new ElementType[MaxSize + 1];
        size = 0;
        capacity = MaxSize + 1;
        elem[0] = MAXDATA;
    }
    
    MaxHeap::MaxHeap(int MaxSize)
    {
    
        elem = new ElementType[MaxSize + 1];
        size = 0;
        capacity = MaxSize + 1;
        elem[0] = MAXDATA;
    }
    
    MaxHeap::~MaxHeap()
    {
        delete[] elem;
    }
    
    bool MaxHeap::IsFull()
    {
        if (size >= capacity)
            return true;
        else
            return false;
    }
    
    bool MaxHeap::IsEmpty()
    {
        if (size == 0)
            return true;
        else
            return false;
    }
    
    void MaxHeap::Insert(ElementType item)
    {
        //判断堆是否已满
        if (IsFull())
        {
            std::cout << "最大堆已满" << std::endl;
            return;
        }
        int i = ++size;
        //将新元素放在堆最后,然后依次和父亲节点比较,换位置
        for (; elem[i / 2] < item; i /= 2)
            elem[i] = elem[i / 2];
        elem[i] = item;
    }
    
    ElementType MaxHeap::DeleteMax()
    {
        //从最大堆中取出键值为最大的元素,并删除一个节点
        int parent, child;
        ElementType MaxItem, temp;
        if (IsEmpty())
        {
            std::cout << "最大堆已为空" << std::endl;
            return -1;
        }
        MaxItem = elem[1]; //取出根节点的最大值
        //用最大堆中最后一个元素从根节点开始从向上过滤下层节点
        temp = elem[size--];
        for (parent = 1; parent * 2 <= size; parent = child)
        {
            child = 2 * parent;
            if ((child != size) && elem[child] < elem[child + 1])
                child++;
            if (temp >= elem[child])
                break;
            else
                elem[parent] = elem[child];
        }
        elem[parent] = temp;
        return MaxItem;
        return 0;
    }
    
    void MaxHeap::print()
    {
        for (int i = 1; i <= size; i++)
            std::cout << elem[i] << " ";
    }
    
    
    
    ////////////////////////////////////////////////////////
    //测试
    #include <iostream>
    #include "MaxHeap.h"
    using namespace std;
    
    int main()
    {
        MaxHeap *h = new MaxHeap(100);
        //构造堆
        for (int i = 0; i < 100; i++)
            h->Insert(i);
        
        h->print(); //打印堆
    
        cout << endl;
        //得到堆排序的输出结果
        for (int i = 0; i < 100; i++)
            cout << h->DeleteMax() << " ";
        cout << endl;    
        system("pause");
        return 0;
    }
  • 相关阅读:
    Valid Anagram
    数据结构与算法2016-06-02
    数据结构与算法2016-06-03
    Delete Node in a Linked List
    Move Zeroes
    Javascript 常用的工具函数,更新中...
    有用的Javascript,长期更新...
    sql基本语法
    Javascript 有用的奇淫技巧
    关于 Vue 的一些问题(面试中面试官想听到的答案)
  • 原文地址:https://www.cnblogs.com/yongssu/p/4402796.html
Copyright © 2020-2023  润新知