zoukankan      html  css  js  c++  java
  • 大小堆C++实现

    C++大小堆实现(仿函数)

    具体代码如下

    #pragma once 
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    template<class T>
    class Big
    {
    public:
        bool operator()(T x, T y)
        {
            return x > y;
        }
    };
    template<class T=int>
    class Sma
    {
    public:
        bool operator()(T x, T y)
        {
            return x < y;
        }
    };
    
    template<class T,class Cmp>
    class Heap
    {
    public:
        Heap()
        {}
        Heap(const T* arr, size_t size)
        {
            for (int i = 0; i < size; ++i)
            {
                _heap.push_back(arr[i]);
            }
            int root = (_heap.size() - 2) / 2;//找到第一个非叶子结点
            while (root>=0)
                //向下调整
                AdjustDown(root--);
        }
    
        void Push(T & t)
        {
            _heap.push_back(t);
            AdjustUp(_heap.size() - 1);
        }
        void pop()
        {
            if (_heap.size() == 0)
                return;
            if (_heap.size() <= 2)
            {
                swap(_heap[0], _heap[_heap.size() - 1]);
                _heap.pop_back();
            }
            else
            {
                swap(_heap[0], _heap[_heap.size() - 1]);
                _heap.pop_back();
                AdjustDown(0);
            }
        }
        bool IsEmpty()const
        {
            return _heap.size() == 0;
        }
        const T & top() const
        {
            if (_heap.size() != 0)
                return _heap[0];
            else
                throw exception("this is a bug");
        }
    protected:
        void AdjustDown(int root)
        {
            //int child = root * 2 + 2 >= _heap.size() ? root * 2 + 1 : Cmp(_heap[root * 2 + 1], _heap[root * 2 + 2]) ? root * 2 + 1 : root * 2 + 2;
            while (root <= (_heap.size() - 2) / 2)
            {
                int child = root * 2 + 2 >= _heap.size() ? root * 2 + 1 : Cmp()(_heap[root * 2 + 1], _heap[root * 2 + 2]) ? root * 2 + 1 : root * 2 + 2;
                if (!Cmp()(_heap[root], _heap[child]))
                {
                    swap(_heap[root], _heap[child]);
                }
                else
                {
                    break;
                }
                root = child;
            }
        }
    
        void AdjustUp(int child)
        {
            while (child >= 1)
            {
                int root = (child - 1) / 2;
                if (!Cmp()(_heap[root], _heap[child]))
                {
                    swap(_heap[root], _heap[child]);
                }
                child = root;
            }
        }
    protected:
        vector<T> _heap;
    };
    
    
    void test_heap()
    {
        int arr[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
        Heap<int, Sma<int> >hp1(arr, 10);
        int b = 3;
        hp1.Push(b);
        cout << "Over!" << endl;
        while (!hp1.IsEmpty())
        {
            cout << hp1.top() << " ";
            hp1.pop();
        }
        system("pause");
    }
  • 相关阅读:
    如何在SpringMVC中使用REST风格的url
    c#实现的udt
    数据库查询服务化-缓存和分页
    c#常用数据库封装再次升级
    c#数据库连接池Hikari重构升级
    c# 常用数据库封装
    聊聊数据存储查询
    c#分析SQL语句
    c# 分析SQL语句中的表操作
    c#最近博文结尾
  • 原文地址:https://www.cnblogs.com/lang5230/p/5309220.html
Copyright © 2011-2022 走看看