青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

仿STL中的堆算法的一個(gè)實(shí)現(xiàn)

RT。
堆的性質(zhì)之類的不再這里闡述,寫這個(gè)算法只為了更好的理解STL中的堆算法,如果看不懂STL中的算法也可以來參考這里給出的算法,因?yàn)槭羌僀的看起來會(huì)省去很多語言方面的細(xì)節(jié)。
同時(shí)里面還有一個(gè)STL中對(duì)應(yīng)算法的測(cè)試以比較兩者的效果。

/********************************************************************
    created:    2007/3/18
    filename:     main.cpp
    author:        Lichuang
   
    purpose:    測(cè)試模擬堆算法
*********************************************************************/

#include <algorithm>
#include <iostream>
#include <time.h>

using namespace std;

// push_heap為向堆中添加一個(gè)新的元素, 調(diào)用這個(gè)算法的前提是[First, Last)之間的元素滿足堆的條件
// 新加入的元素為L(zhǎng)ast
void    push_heap(int* pFirst, int* pLast);

// pop_heap為從堆中刪除一個(gè)元素, 調(diào)用這個(gè)算法的前提是[First, Last)之間的元素滿足堆的條件
// 被刪除的元素被放置到Last - 1位置,由于這里是max-heap,所以被刪除的元素是這個(gè)序列中最大的元素
void    pop_heap(int* pFirst, int* pLast);

// make_heap將序列[First, Last)中的元素按照堆的性質(zhì)進(jìn)行重組
void    make_heap(int* pFirst, int* pLast);

// 對(duì)堆進(jìn)行排序, 調(diào)用這個(gè)函數(shù)可以成功排序的前提是[pFirst, pLast)中的元素符合堆的性質(zhì)
void    sort_heap(int* pFirst, int* pLast);

// 判斷一個(gè)序列[First, Last)是否滿足堆的條件,是就返回1,否則返回0
char    is_heap(int* pFirst, int* pLast);

void    test_heap_algo(int *pArray, int nLength);
void    test_heap_algo_in_stl(int *pArray, int nLength);
void    display_array(int *pArray, int nLength);

int main()
{
    srand(time(NULL));
    int Array[10], Array2[10];
    for(int i = 0; i < 10; ++i)
        Array[i] = Array2[i] = rand();

    test_heap_algo(Array, sizeof(Array) / sizeof(int));
    test_heap_algo_in_stl(Array2, sizeof(Array2) / sizeof(int));

    return 0;
}

// 靜態(tài)函數(shù), 用于根據(jù)堆的性質(zhì)調(diào)整堆
static void adjust_heap(int *pFirst, int nHoleIndex, int nLen, int nValue);

// push_heap為向堆中添加一個(gè)新的元素, 調(diào)用這個(gè)算法的前提是[First, Last)之間的元素滿足堆的條件
// 新加入的元素為L(zhǎng)ast
void push_heap(int* pFirst, int* pLast)
{
    int nTopIndex, nHoleIndex, nParentIndex;
    int nValue;

    nTopIndex = 0;
    nHoleIndex = (int)(pLast - pFirst - 1);
    nParentIndex = (nHoleIndex - 1) / 2;
    nValue = *(pLast - 1);
    // 如果需要插入的節(jié)點(diǎn)值比父節(jié)點(diǎn)大, 上溯繼續(xù)查找
    while (nHoleIndex > nTopIndex && pFirst[nParentIndex] < nValue)
    {
        pFirst[nHoleIndex] = pFirst[nParentIndex];
        nHoleIndex = nParentIndex;
        nParentIndex = (nHoleIndex - 1) / 2;
    }
    pFirst[nHoleIndex] = nValue;
}

// pop_heap為從堆中刪除一個(gè)元素, 調(diào)用這個(gè)算法的前提是[First, Last)之間的元素滿足堆的條件
// 被刪除的元素被放置到Last - 1位置,由于這里是max-heap,所以被刪除的元素是這個(gè)序列中最大的元素
void pop_heap(int* pFirst, int* pLast)
{
    int nValue;

    nValue = *(pLast - 1);
    *(pLast - 1) = *pFirst;
    adjust_heap(pFirst, 0, (int)(pLast - pFirst - 1), nValue);
}

// make_heap將序列[First, Last)中的元素按照堆的性質(zhì)進(jìn)行重組
void make_heap(int* pFirst, int* pLast)
{
    int nLen, nParentIndex;

    nLen = (int)(pLast - pFirst);
    nParentIndex = (nLen - 1) / 2;

    while (true)
    {
        // 對(duì)父節(jié)點(diǎn)進(jìn)行調(diào)整, 把父節(jié)點(diǎn)的值調(diào)整到合適的位置
        adjust_heap(pFirst, nParentIndex, nLen, pFirst[nParentIndex]);
        if (0 == nParentIndex)
            return;
        nParentIndex--;
    }
}

// 對(duì)堆進(jìn)行排序, 調(diào)用這個(gè)函數(shù)可以成功排序的前提是[pFirst, pLast)中的元素符合堆的性質(zhì)
void sort_heap(int* pFirst, int* pLast)
{
    // 調(diào)用pop_heap函數(shù), 不斷的把當(dāng)前序列中最大的元素放在序列的最后
    while(pLast - pFirst > 1)
        pop_heap(pFirst, pLast--);
}

// 判斷一個(gè)序列[First, Last)是否滿足堆的條件,是就返回1,否則返回0
char is_heap(int* pFirst, int* pLast)
{
    int nLen, nParentIndex, nChildIndex;

    nLen = (int)(pLast - pFirst);
    nParentIndex = 0;
    for (nChildIndex = 1; nChildIndex < nLen; ++nChildIndex)
    {
        if (pFirst[nParentIndex] < pFirst[nChildIndex])
            return 0;

        // 當(dāng)nChildIndex是偶數(shù)時(shí), 那么父節(jié)點(diǎn)已經(jīng)和它的兩個(gè)子節(jié)點(diǎn)進(jìn)行過比較了
        // 將父節(jié)點(diǎn)遞增1
        if ((nChildIndex & 1) == 0)
            ++nParentIndex;
    }

    return 1;
}

// 一個(gè)靜態(tài)函數(shù)僅供adjust_heap調(diào)用以證實(shí)JJHOU的結(jié)論
static void push_heap(int *pFirst, int nHoleIndex, int nTopIndex, int nValue)
{
    int nParentIndex;

    nParentIndex = (nHoleIndex - 1) / 2;
    while (nHoleIndex > nTopIndex && pFirst[nParentIndex] < nValue)
    {
        pFirst[nHoleIndex] = pFirst[nParentIndex];
        nHoleIndex = nParentIndex;
        nParentIndex = (nHoleIndex - 1) / 2;
    }
    pFirst[nHoleIndex] = nValue;
}

// 對(duì)堆進(jìn)行調(diào)整, 其中nHoleIndex是目前堆中有空洞的節(jié)點(diǎn)索引, nLen是待調(diào)整的序列長(zhǎng)度
// nValue是需要安插進(jìn)入堆中的值
static void adjust_heap(int *pFirst, int nHoleIndex, int nLen, int nValue)
{
    int nTopIndex, nSecondChildIndex;

    nTopIndex = nHoleIndex;
    nSecondChildIndex = 2 * nTopIndex + 2;
    while (nSecondChildIndex < nLen)
    {
        if (pFirst[nSecondChildIndex] < pFirst[nSecondChildIndex - 1])
            --nSecondChildIndex;
        pFirst[nHoleIndex] = pFirst[nSecondChildIndex];
        nHoleIndex = nSecondChildIndex;
        nSecondChildIndex = 2 * nHoleIndex + 2;
    }
    if (nSecondChildIndex == nLen)
    {
        pFirst[nHoleIndex] = pFirst[nSecondChildIndex - 1];
        nHoleIndex = nSecondChildIndex - 1;
    }

    // 以下兩個(gè)操作在這個(gè)函數(shù)中的作用相同, 證實(shí)了<<STL源碼剖析>>中P178中JJHOU所言
    //pFirst[nHoleIndex] = nValue;
    push_heap(pFirst, nHoleIndex, nTopIndex, nValue);
}

void    test_heap_algo(int *pArray, int nLength)
{
    std::cout << "\ntest_heap_algo()\n";
    make_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    push_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    pop_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    if (is_heap(pArray, pArray + nLength - 1))
    {
        std::cout << "is heap!\n";
    }
    else
    {
        std::cout << "is not heap!\n";
    }

    make_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    if (is_heap(pArray, pArray + nLength))
    {
        std::cout << "is heap!\n";
    }
    else
    {
        std::cout << "is not heap!\n";
    }

    sort_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);
}

void    test_heap_algo_in_stl(int *pArray, int nLength)
{
    std::cout << "\ntest_heap_algo_in_stl()\n";

    std::make_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    std::push_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    std::pop_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    // 注意is_heap不是STL中支持的算法, 貌似只有SGI的實(shí)現(xiàn)才有這個(gè)函數(shù)!
    if (is_heap(pArray, pArray + nLength - 1))
    {
        std::cout << "is heap!\n";
    }
    else
    {
        std::cout << "is not heap!\n";
    }

    std::make_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);

    if (is_heap(pArray, pArray + nLength))
    {
        std::cout << "is heap!\n";
    }
    else
    {
        std::cout << "is not heap!\n";
    }

    std::sort_heap(pArray, pArray + nLength);
    display_array(pArray, nLength);
}

void    display_array(int *pArray, int nLength)
{
    for (int i = 0; i < nLength; ++i)
        std::cout << pArray[i] << " ";
    std::cout << std::endl;
}



 

 

posted on 2007-03-20 00:28 那誰 閱讀(2680) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C\C++算法與數(shù)據(jù)結(jié)構(gòu)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频免费观看| 免费人成网站在线观看欧美高清| 亚洲一区二区三区四区五区黄| 亚洲国产精品www| 在线观看视频日韩| 亚洲国产精品久久久久秋霞影院 | 一区二区三区视频免费在线观看| 亚洲欧洲一区二区在线观看| 日韩亚洲在线观看| 亚洲欧美区自拍先锋| 欧美呦呦网站| 免费观看欧美在线视频的网站| 另类国产ts人妖高潮视频| 欧美国产日本韩| 在线视频一区观看| 久久国产夜色精品鲁鲁99| 麻豆精品视频在线| 欧美午夜精品理论片a级大开眼界| 国产乱人伦精品一区二区| 一区在线免费| 亚洲欧美卡通另类91av| 久久久一二三| 在线一区二区三区做爰视频网站 | 9色porny自拍视频一区二区| 午夜精品在线| 欧美风情在线观看| 亚洲午夜极品| 女女同性女同一区二区三区91| 欧美性一区二区| 亚洲国产日韩一级| 久久久精品一品道一区| 日韩午夜激情| 久久在线免费视频| 国产视频精品va久久久久久| a4yy欧美一区二区三区| 蜜桃久久精品一区二区| 亚洲免费小视频| 欧美日韩精品免费观看视频| 在线成人www免费观看视频| 亚洲一区二区三区久久| 欧美.com| 久久人91精品久久久久久不卡| 国产精品亚洲产品| 一级日韩一区在线观看| 亚洲高清不卡在线| 亚洲欧美视频在线观看| 欧美午夜在线一二页| 亚洲乱码国产乱码精品精98午夜| 久久精品一级爱片| 亚洲欧美日韩成人| 国产精品黄视频| 国产精品美女久久久久久免费| 亚洲人成啪啪网站| 久久久久在线观看| 韩国三级电影一区二区| 亚洲欧美日韩成人| 一区二区三区www| 欧美日韩国产影院| 日韩视频永久免费观看| 欧美电影免费观看高清完整版| 午夜在线成人av| 国产欧美一区二区精品仙草咪| 欧美亚洲视频在线观看| 亚洲影院污污.| 国产精品一区二区三区乱码 | 精品69视频一区二区三区| 久久久精品国产99久久精品芒果| 亚洲一区国产精品| 国产视频一区二区在线观看 | 亚洲在线成人精品| 欧美色欧美亚洲高清在线视频| 一区二区三区国产在线| 夜夜狂射影院欧美极品| 欧美日韩一区二区三区在线| 一区二区三区四区精品| 亚洲四色影视在线观看| 国产日韩精品视频一区| 麻豆av一区二区三区久久| 欧美sm视频| 亚洲视屏一区| 香蕉国产精品偷在线观看不卡| 国模吧视频一区| 亚洲第一精品福利| 欧美性生交xxxxx久久久| 久久久国产午夜精品| 欧美~级网站不卡| 亚洲一区三区视频在线观看| 亚洲欧美综合| 亚洲人精品午夜| 亚洲综合丁香| 亚洲黄色成人久久久| 中文在线不卡| 亚洲国产成人av| 中文av一区特黄| 在线成人激情黄色| 一本一本大道香蕉久在线精品| 国产日韩欧美高清| 亚洲二区在线视频| 国产日产亚洲精品系列| 亚洲高清在线观看| 国产欧美一区二区三区在线看蜜臀 | 欧美一乱一性一交一视频| 久久精品论坛| 亚洲已满18点击进入久久| 久久久国产精品一区| 一区二区毛片| 亚洲美女视频在线观看| 亚洲毛片播放| **网站欧美大片在线观看| 亚洲日本中文字幕免费在线不卡| 国产久一道中文一区| 亚洲人在线视频| 狠狠色丁香久久综合频道| 在线亚洲欧美| 99re热精品| 免费国产一区二区| 久久久久99精品国产片| 欧美日韩在线观看一区二区三区 | 欧美裸体一区二区三区| 久久夜色撩人精品| 国产精品中文字幕在线观看| 亚洲高清色综合| 在线观看亚洲精品视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲激情在线激情| 欧美中文在线观看| 久久爱91午夜羞羞| 国产精品久久久久免费a∨大胸| 亚洲国产成人91精品| 在线日韩一区二区| 久久九九国产| 麻豆精品精品国产自在97香蕉| 国产精品亚洲激情| 午夜视频久久久| 久久成年人视频| 国产视频丨精品|在线观看| 亚洲欧美另类综合偷拍| 亚洲一区激情| 国产精品久久久久久久一区探花| 亚洲精品一级| 亚洲伊人一本大道中文字幕| 欧美视频精品在线观看| 正在播放亚洲一区| 午夜精品久久久久久99热软件| 国产精品a久久久久| 亚洲视频一区在线观看| 欧美亚洲免费电影| 国产欧美日韩综合| 欧美在线一二三区| 欧美顶级大胆免费视频| 日韩视频在线观看| 欧美午夜精品久久久久免费视| 亚洲深夜福利| 久久久久国产一区二区三区四区| 精品成人久久| 欧美激情1区2区3区| 日韩午夜中文字幕| 久久不射中文字幕| 亚洲国产精品ⅴa在线观看 | 欧美一区二视频在线免费观看| 久久精品二区三区| 亚洲第一在线视频| 欧美日本在线视频| 亚洲一区二区三区四区五区午夜 | 性欧美精品高清| 99热在这里有精品免费| 亚洲国产精品视频| 亚洲一区免费看| 一区二区在线观看视频在线观看| 欧美/亚洲一区| 亚洲欧美日韩精品久久久久 | 亚洲一区bb| 欧美ed2k| 午夜精品婷婷| 91久久黄色| 国产一区二区三区在线播放免费观看| 另类图片综合电影| 亚洲永久免费精品| 亚洲国产成人精品视频| 欧美有码在线视频| 99精品99| 激情成人av| 国产精品视频久久| 欧美精选在线| 久久久久久伊人| 亚洲中字在线| 亚洲三级网站| 欧美肥婆在线| 久久久国产成人精品| 亚洲天堂av在线免费| 亚洲二区免费| 国产综合精品一区| 欧美手机在线视频| 蜜桃av噜噜一区| 久久黄金**| 性做久久久久久久久| 亚洲最黄网站| 亚洲激情图片小说视频| 免费在线观看日韩欧美| 久久久久久久波多野高潮日日 |