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

隨感而發

雜七雜八

統計

留言簿(13)

閱讀排行榜

評論排行榜

用堆實現優先隊列

昨天學習了用堆排序,今天學習了用堆實現優先隊列。呵呵。都沒有思路好記錄的,記住堆的性質:
1.一個是他是一個數組(當然你也可以真的用鏈表來做。)。
2.他可以看做一個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nSize / 2個。
3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i/2,他的左孩子結點就是i*2,右孩子結點就是i*2+1,如果下標從0開始,要復雜一點。
4.他的父節點一定不比子節點小(我所指的是最大堆)。

由這些性質就可以看出堆得一些優點:
1.可以一下找到最大值,就在第一個位置heap[1].
2.維持堆只需要log(2,n)(n是數據個數)的復雜度,速度比較快。他只需要比較父與子之間的大小關系,所以比較次數就是樹的高度,而他是一個完全二叉樹,所以比較次數就是log(2,n)。

具體實現:
具體實現就看看源代碼吧!努力地組織了一下,呵呵,希望能看懂,奉上源代碼:
#include <stdio.h>
#include 
<stdlib.h>

//定義一個堆得結構體,
struct MyHeap 
{
    
int* pnData;    //指向數據的指針
    int nSize;     //當前堆中的元素個數
};

//調整數據,維持堆得性質,這個和上次heapify的作用一樣
//只是這個時從子道父節點這樣的判斷而已。
int IncreaseKey(MyHeap* pHeap, int nPos)
{
    
//循環和他父節點判斷,只要 nPos > 1他就有父節點 
    while(nPos > 1)        
    {
        
int nMax = pHeap->pnData[nPos];
        
int nParent = nPos / 2;

        
//如果他比父節點大,交換數據,并使判斷進入父節點
        
//(因為只有父節點可能會影響堆得性質。他的數據改變了。)
        if (nMax > pHeap->pnData[nParent])
        {
            pHeap
->pnData[nPos] = pHeap->pnData[nParent];
            pHeap
->pnData[nParent] = nMax;
            nPos 
= nParent;
        }
        
else        //否則堆沒有被破壞,退出循環
        {
            
break;
        }
    }

    
return 1;
}

//插入數據,這里pnHeap為要插入的隊,nLen為當前堆得大小。
//nData為要插入的數據,這里注意報保證堆得空間足夠。
int Insert(MyHeap* pHeap, int nData)
{
    
++pHeap->nSize;            //添加數據到末尾
    pHeap->pnData[pHeap->nSize] = nData;
    IncreaseKey(pHeap, pHeap
->nSize);
    
return 1;
}

//彈出堆中對大元素,并使堆得個數減一
int PopMaxHeap(MyHeap* pHeap)
{
    
int nMax = pHeap->pnData[1];  //得到最大元素

    
//不要忘記維持堆得性質,因為最大元素已經彈出了,主要思路就是
    
//同他最大孩子填充這里。

    
int nPos = 1;            //起始位1,因為他彈出,所以是這里開始破壞堆得性質的
    int nChild = nPos * 2;    //他的左孩子的位置,

    
//循環填充,用最大孩子填充父節點
    while(nChild <= pHeap->nSize)
    {
        
int nTemp = pHeap->pnData[nChild];
        
if (nChild + 1 <= pHeap->nSize &&
            nTemp 
< pHeap->pnData[nChild + 1])
        {
            
++nChild;
            nTemp 
= pHeap->pnData[nChild];
        }
        pHeap
->pnData[nPos] = nTemp;
        nPos 
= nChild;
        nChild 
*= 2;
    }
    
//最好一個用最末尾的填充。
    pHeap->pnData[nPos] = pHeap->pnData[pHeap->nSize];
    
--pHeap->nSize;            //堆個數量減一
    return nMax;            //返回最大值。
}

//程序入口main
int main()
{
    MyHeap myHeap;            
//定義一個堆
    myHeap.pnData = (int*)::malloc(sizeof(int*11); //申請數據空間
    myHeap.nSize = 0;            //初始大小為0

    
for (int i = 1; i <= 10++i)        //給優先隊列堆里添加數據
    {
        Insert(
&myHeap, i);
    }

    
for (int i = 1; i <= 10++i)        //測試優先隊列是否建立成功
    {
        printf(
"%d ", myHeap.pnData[i]);
    }
    printf(
"\n");

    
while(myHeap.nSize > 0)  //逐一彈出隊列的最大值。并驗證
    {
        printf(
"%d ", PopMaxHeap(&myHeap));
    }
    printf(
"\n");

    ::free(myHeap.pnData);        
//最后不要忘記釋放申請的空間
    system("pause");
    
return 0;
}


posted on 2009-04-22 20:02 shongbee2 閱讀(5899) 評論(2)  編輯 收藏 引用 所屬分類: 數據結構和算法

評論

# re: 用堆實現優先隊列 2011-08-21 17:19 anon

若堆為:

3
/ \
3 2
/ \ /
1 1 2

按照文中算法,這樣的堆彈出頂元素3后,左子3頂替之,然后左子1頂替3,最后末尾元素2頂替1。于是變成:

3
/ \
1 2
/ \
2 1

這樣就不是最大堆了。  回復  更多評論   

# re: 用堆實現優先隊列 2013-09-27 16:23 shongbee2

@anon
要維護堆的性質的。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黑人一区二区三区四区五区| 欧美一区二区高清在线观看| 午夜一区不卡| 一区二区动漫| 亚洲一区久久| 久久精品国产99国产精品| 欧美在线播放一区二区| 性娇小13――14欧美| 久久久久国产免费免费| 美日韩精品视频免费看| 欧美福利电影在线观看| 亚洲精品久久久一区二区三区| 最新中文字幕一区二区三区| 一区二区三区视频在线| 亚洲一区欧美| 欧美中文字幕在线| 免费视频一区二区三区在线观看| 亚洲国产91| 亚洲午夜精品福利| 久久精品人人做人人综合| 毛片基地黄久久久久久天堂| 欧美激情一区二区三区在线视频观看| 欧美日本成人| 激情综合久久| 亚洲欧美久久久| 模特精品在线| 亚洲一区综合| 欧美精品一区二| 激情欧美日韩一区| 亚洲永久精品国产| 亚洲高清视频中文字幕| 午夜精品国产更新| 欧美成人免费在线观看| 国产一区二区按摩在线观看| 99热在这里有精品免费| 久久婷婷av| 午夜视频久久久| 国产精品久久久对白| 亚洲蜜桃精久久久久久久| 久久综合给合久久狠狠色| 亚洲小视频在线| 欧美欧美天天天天操| 在线精品高清中文字幕| 久久精品中文字幕一区| 在线视频精品一| 欧美女同在线视频| 亚洲人成网站在线观看播放| 久久在线视频| 国产亚洲欧洲一区高清在线观看| 韩日午夜在线资源一区二区| 在线观看成人小视频| 亚洲午夜伦理| 日韩亚洲欧美精品| 欧美日韩国产美| 日韩视频专区| 亚洲黄色精品| 欧美大片在线看| 亚洲毛片在线观看| 亚洲国产精品视频一区| 欧美aa国产视频| 91久久国产自产拍夜夜嗨| 老司机精品久久| 欧美有码视频| 一区二区三区在线不卡| 裸体素人女欧美日韩| 久久久久久夜精品精品免费| 国语精品中文字幕| 美国成人直播| 欧美1级日本1级| 亚洲美女黄网| 99综合视频| 国产精品亚洲综合色区韩国| 欧美一区91| 久久精品国产清自在天天线| 在线观看中文字幕不卡| 亚洲高清不卡在线| 欧美三区在线观看| 久久精品2019中文字幕| 久久久久久久999| 亚洲精品国产欧美| 一区二区三区色| 国模精品娜娜一二三区| 欧美电影美腿模特1979在线看| 久久经典综合| 亚洲久久在线| 亚洲欧美日本国产专区一区| 亚洲欧美综合一区| 国产专区精品视频| 亚洲第一毛片| 国产精品免费看久久久香蕉| 久久手机精品视频| 欧美日韩国产小视频| 久久av在线看| 欧美精品在线免费观看| 久久久精品动漫| 欧美激情一区二区在线 | 亚洲欧美卡通另类91av| 校园激情久久| 亚洲免费av网站| 欧美一区激情视频在线观看| 日韩亚洲精品电影| 午夜日韩福利| 一本一道久久综合狠狠老精东影业 | 欧美日韩在线播放| 久久国产精品一区二区三区四区| 久久精品三级| 亚洲日本成人网| 亚洲专区欧美专区| 在线看不卡av| 亚洲欧美激情诱惑| 亚洲一区二区久久| 母乳一区在线观看| 久久精品综合| 国产乱理伦片在线观看夜一区| 亚洲国产精品成人久久综合一区| 国产性天天综合网| 亚洲一区二区精品在线观看| 亚洲三级免费电影| 久久一区视频| 久久中文在线| 韩国成人精品a∨在线观看| 中文亚洲免费| 亚洲视频一区二区| 欧美成人免费全部| 欧美黄色一区| 亚洲国产精品第一区二区| 久久国产精品一区二区三区四区| 亚洲欧美一区二区激情| 欧美色欧美亚洲高清在线视频| 亚洲国产日韩精品| 亚洲精品一品区二品区三品区| 看片网站欧美日韩| 欧美成人午夜77777| 亚洲电影免费观看高清完整版在线| 午夜精品久久久久久久99热浪潮| 亚洲一区二区日本| 欧美丝袜第一区| 在线亚洲自拍| 午夜精品免费| 国产欧美日韩视频在线观看 | 在线观看亚洲精品| 久久先锋影音| 亚洲国产精品va在看黑人| 亚洲日本一区二区三区| 欧美精品精品一区| 一区二区成人精品 | 日韩视频永久免费| 亚洲午夜久久久久久久久电影网| 欧美视频二区| 亚洲欧美成人网| 久久久人成影片一区二区三区| 国产午夜精品麻豆| 久久综合狠狠| 亚洲精品一区二区三区在线观看| 看片网站欧美日韩| 亚洲国产精品久久久久秋霞不卡| 亚洲精品视频免费在线观看| 欧美日韩亚洲综合| 亚洲欧美日韩另类精品一区二区三区| 久久高清国产| 91久久国产综合久久| 欧美日韩免费高清| 欧美一级久久久久久久大片| 欧美sm重口味系列视频在线观看| 亚洲精选久久| 国产偷国产偷精品高清尤物| 麻豆精品一区二区综合av| 99精品国产热久久91蜜凸| 久久国产高清| 亚洲六月丁香色婷婷综合久久| 国产精品国产亚洲精品看不卡15 | 欧美高清自拍一区| 一本不卡影院| 久久夜色精品| 一区二区三区免费观看| 国产亚洲欧美一区二区| 欧美精品三级在线观看| 欧美一区二区免费观在线| 亚洲国产精品一区二区第四页av| 亚洲综合视频网| 亚洲激情第一页| 国产美女精品免费电影| 欧美国产精品v| 性色av一区二区三区红粉影视| 亚洲大片免费看| 久久精品国产精品亚洲精品| 99国产麻豆精品| 国语自产精品视频在线看| 欧美午夜免费电影| 免费在线观看精品| 久久久久久久综合日本| 亚洲视频网在线直播| 亚洲国产你懂的| 老鸭窝亚洲一区二区三区| 午夜精品亚洲| 在线视频日本亚洲性| 91久久久久久| 亚洲国产高清在线| 一区二区三区我不卡| 国产免费一区二区三区香蕉精|