欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

【數(shù)據(jù)結(jié)構(gòu)】用模版實(shí)現(xiàn)大小堆、實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列,以及堆排序

    一、用模版實(shí)現(xiàn)大小堆

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),鏡湖網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:鏡湖等地區(qū)。鏡湖做網(wǎng)站價(jià)格咨詢:18980820575

    如果不用模版的話,寫(xiě)大小堆,就需要分別實(shí)現(xiàn)兩次,但是應(yīng)用模版的話問(wèn)題就簡(jiǎn)單多了,我們只需要實(shí)現(xiàn)兩個(gè)仿函數(shù),Greater和Less就行了,仿函數(shù)就是用類實(shí)現(xiàn)一個(gè)()的重載就實(shí)現(xiàn)了仿函數(shù)。這個(gè)看下代碼就能理解了。再設(shè)計(jì)參數(shù)的時(shí)候,需要把模版設(shè)計(jì)成模版的模版參數(shù),因?yàn)橐獙?shí)現(xiàn)大小堆嘛!當(dāng)我們實(shí)現(xiàn)好一個(gè)大堆或者小隊(duì)的邏輯后只需要用模版接收的Greater或Less類定義一個(gè)變量,就能實(shí)現(xiàn)通用功能了。

template<typename T>
struct Less
{
    bool operator()(const T& l, const T& r)
    {
        return l < r;
    }
};

template<class T>
struct Greater
{
    bool operator()(const T& l, const T& r)
    {
        return l>r;
    }
};

template <class T,template<class> class compare = less>
class Heap
{
public:
    Heap()
    {}

    Heap(T* a,size_t size)
    {
        size_t index = 0;
        while (index < size)
        {
            _a.push_back(a[index]);
            index++;
        }

        for (int i = (_a.size() - 2) / 2; i >= 0; i--)
            _AdjustDown(i);
    }

    void push(const T& x)
    {
        _a.push_back(x);
        _AdjustUp(_a.size() -1);
    }

    void pop()
    {
        size_t size = _a.size();
        assert(size > 0);
        swap(_a[0], _a[size - 1]);
        _a.pop_back();
        size = _a.size();
        _AdjustDown(0);
    }

    size_t top()
    {
        assert(!_a.empty());

        return _a[0];
    }

    bool empty()
    {
        return _a.size() == 0;
    }

    size_t Size()
    {
        return _a.size();
    }

    void Print()
    {
        for (int i = 0; i < _a.size(); i++)
        {
            cout << _a[i] << " ";
        }
        cout << endl;
    }

protected:
    void _AdjustUp(int child)
    {
        int parent = (child - 1) / 2;
        compare<T> com;  //如果是大堆傳過(guò)來(lái)就是用大堆的邏輯,小堆就實(shí)現(xiàn)小堆的邏輯
        while (child > 0)
        {
            //找出孩子中的最大孩子
            if (com(_a[child] , _a[parent]))
            {
                swap(_a[child], _a[parent]);
                child = parent;
                parent = (child - 1) / 2;
            }
            else
            {
                break;
            }
        }

    }

    void _AdjustDown(size_t parent)
    {
        size_t child = 2 * parent + 1;
        compare<T> com; //如果是大堆傳過(guò)來(lái)就是用大堆的邏輯,小堆就實(shí)現(xiàn)小堆的邏輯
        while (child < _a.size())
        {
            //找出孩子中的最大孩子
            if (child + 1 < _a.size() && com(_a[child+1] ,_a[child]))
            {
                ++child;
            }
            //把
            if (com(_a[child] , _a[parent]))
            {
                swap(_a[parent], _a[child]);
                parent = child;
                child = child * 2 + 1;
            }
            else
            {
                break;
            }
        }

    }
protected:
    vector<T> _a;
};

   二、用模版實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列

前面實(shí)現(xiàn)了大小堆,這里我們可以使用適配器,直接調(diào)用大小堆,來(lái)實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列。

template<class T, template<class> class compare = Less>
class priorityQueue
{
private:
    Heap<T, compare> _hp; 
public:
    void push(const T& x)
    {
        _hp.push(x);
    }

    void pop()
    {
        _hp.pop();
    }

    T& Top()
    {
        return _hp.top();
    }

    void Print()
    {
        _hp.Print();
    }

};

    三、堆排序的實(shí)現(xiàn)

    堆排序的實(shí)現(xiàn)簡(jiǎn)單思路,(升序)先構(gòu)造出來(lái)一個(gè)大堆,調(diào)整堆后,將堆頭和最后一個(gè)數(shù)據(jù)交換,最大值就換到了數(shù)組的最后,然后在調(diào)整堆,但是size需要減少1,因?yàn)樽畲蟮囊呀?jīng)調(diào)整到最后,如果再加上它調(diào)整又會(huì)回到堆頭。

int*& HeapSort(int* a, size_t size)
{
    for (int i = (size - 2) / 2; i >= 0; i--)
    {
        _AdjustDown(a, size, i);
    }

    for (int i = 0; i < size; i++)
    {
        swap(a[0], a[size - i - 1]);
        _AdjustDown(a, size - i - 1, 0);
    }

    return a;
}

本文標(biāo)題:【數(shù)據(jù)結(jié)構(gòu)】用模版實(shí)現(xiàn)大小堆、實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列,以及堆排序
當(dāng)前URL:http://chinadenli.net/article10/jeiogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站虛擬主機(jī)、網(wǎng)站策劃手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
亚洲精品美女三级完整版视频| 在线免费观看黄色美女| 午夜精品国产精品久久久| 午夜久久久精品国产精品| 日本特黄特色大片免费观看| 高清亚洲精品中文字幕乱码| 亚洲欧美日本视频一区二区| 亚洲中文字幕亲近伦片| 日本美国三级黄色aa| 中文字幕日韩一区二区不卡 | 中文字幕五月婷婷免费| 国产色第一区不卡高清| 殴美女美女大码性淫生活在线播放| 国产真人无遮挡免费视频一区| 亚洲一区二区精品福利| 亚洲精品av少妇在线观看| 欧美精品中文字幕亚洲| 大尺度剧情国产在线视频| 欧美同性视频免费观看| 国产一区二区不卡在线视频| 国产精品久久男人的天堂| 男女一进一出午夜视频| 久久精品国产在热亚洲| 日韩一区欧美二区国产| 亚洲最新中文字幕一区| 亚洲午夜精品视频在线| 麻豆果冻传媒一二三区| 久久亚洲国产视频三级黄| 翘臀少妇成人一区二区| 国产精品一区二区三区日韩av| 亚洲综合色婷婷七月丁香| 99热九九热这里只有精品| 亚洲中文字幕免费人妻| 国产毛片对白精品看片| 男人的天堂的视频东京热| 欧美丰满大屁股一区二区三区| 在线一区二区免费的视频 | 色无极东京热男人的天堂| 日韩国产中文在线视频| 日韩一区二区三区嘿嘿| 欧美日韩一区二区午夜|