這裏寫圖片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<vector>

template <class T>
class Heap
{
public:
    Heap(T* array, size_t size)
    :_size(size)
    {
        _array.resize(_size);
        for (size_t i = 0; i < _size; i++)
            _array[i] = array[i];
        int root = (size - 2) >> 1;
        for (; root >= 0; --root)
            _AdjustDown(root);
    }

    void Push(T data)//插入元素,並且使其任然滿足堆的性質
    {
        _array.push_back(data);
        _size++;
        _AdjustUp(_size - 1);
    }

    void Pop()//刪除堆頂元素,並且使其任然滿足堆的性質
    {
        if (_array.empty())
            return;
        swap(_array[0], _array[_size - 1]);
        _array.pop_back();
        _size--;
        if (_size>0)
            _AdjustDown(0);
    }

    void Print()
    {
        for (size_t i = 0; i < _size; i++)
            cout << _array[i] << " ";
        cout << endl;
    }
private:
    void _AdjustUp(int child)
    {
        int parent = (child - 1) >> 1;
        while (/*parent >= 0*/child>0)
        {
            if (_array[child] > _array[parent])
                return;
            if (_array[child] < _array[parent])
            {
                swap(_array[child], _array[parent]);
                child = parent;
                parent = (child - 1) >> 1;
            }
            /*else
            return;*/
        }
    }
    void _AdjustDown(int parent)
    {
        int child = parent * 2 + 1;
        while (child < _size)
        {
            if (child + 1 < _size && _array[child] > _array[child + 1])
                child += 1;
            if (_array[parent] > _array[child])
            {
                swap(_array[parent], _array[child]);
                parent = child;
                child = parent * 2 + 1;
            }
            else
                return;
        }
    }
private:

    vector<T> _array;
    size_t _size;
};

int main()
{
    int arr[] = { 1, 3, 5, 7, 9, 4, 6, 8, 0 };
    Heap<int> hp(arr, sizeof(arr) / sizeof(arr[0]));
    hp.Print();
    hp.Push(2);
    hp.Print();
    hp.Pop();
    hp.Print();
    getchar();
    return 0;
}

這裏寫圖片描述
這裏寫圖片描述

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 5869
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章