數(shù)據(jù)結(jié)構(gòu) 樹的應(yīng)用(1)堆

堆heap

堆的存儲

堆的結(jié)構(gòu):堆(二叉堆)實際上是完全二叉樹,所以可以用數(shù)組來實現(xiàn)堆的結(jié)構(gòu)推溃。

便于檢索
數(shù)組下標(biāo)i從1開始冲粤,對于下標(biāo)為i的節(jié)點,i/2為其父節(jié)點的下標(biāo)梯捕,2i和2i+1為其左孩子,右孩子節(jié)點下標(biāo)

堆的部分有序性:
MaxHeap任一節(jié)點的值大于或等于其子節(jié)點的值
MinHeap任一節(jié)點的值小于或者等于其子節(jié)點的值


堆(Binary Heap)的實現(xiàn)

實現(xiàn)最小堆代碼(參考自geeksforgeeks:binary-heap)

/*用數(shù)組實現(xiàn)最小堆*/
#include<iostream>
using namespace std;

class MinHeap
{
private:
    int *heap;//實際上用vector更方便一點 
    int MaxLength;//數(shù)組大小
    int curlen;//數(shù)組當(dāng)前長度
    void shiftUp(int index);//在尾部加入一個數(shù)襟铭,用遞歸和父親節(jié)點比較
    void shiftDown(int index);//父節(jié)點和子節(jié)點比較寒砖,往下走(也是遞歸)
public:
    MinHeap(int *array,int length);//構(gòu)造函數(shù),調(diào)用了heaify()
    MinHeap();
    void heapify();//堆化
    void print();//打印數(shù)組
    void deleteMin();//用最后一個元素代替頂部元素,然后shiftDown(0)
    void insertElement(int element);//在尾部插入一個數(shù)哩都,然后shiftUp(index)和父節(jié)點比較往上走

};
MinHeap::MinHeap(int *array, int length) {
    MaxLength = length;
    curlen = length;
    heap = new int(length);
    for (int i = 0; i < length; i++) {
        heap[i] = array[i];
    }
    heapify();//建立最小堆
}
MinHeap::MinHeap(){}
void MinHeap::print() {
    for (int i= 0; i < curlen; i++) {
        cout << heap[i]<<" ";
    }
    cout << endl;
}
void MinHeap::heapify() {
    for (int i = (curlen - 1) / 2; i >= 0; i--) {
        shiftDown(i);
    }
}
void MinHeap::shiftUp(int index) {
    int child = index;
    int parent = (index - 1) / 2;
    if (child == 0)return;
    if (heap[child] < heap[parent]) {
        swap(heap[child], heap[parent]);
        shiftUp(parent);
    }
}
void MinHeap::shiftDown(int index) {
    int parent = index;
    int lchild = parent * 2 + 1;
    int rchild = lchild + 1;
    if (lchild >= curlen) {//葉節(jié)點
        return;
    }
    int min = lchild;
    if (rchild<curlen && heap[min] > heap[rchild]) {//父節(jié)點和較小的子節(jié)點比較
        min = rchild;
    }
    if (heap[parent] > heap[min]) {
        swap(heap[parent], heap[min]);
        shiftDown(min);
    }

    /*for (int i = parent; parent*2 < MaxLength; parent = child) {
        child = 2 * parent + 1;
        if (heap[child] < heap[child + 1]) {//父節(jié)點和較小的子節(jié)點比較
            child++;
        }
        if (heap[parent] > heap[child]) {
            swap(heap[parent], heap[child]);
        }
        else {
            break;
        }
    }*/
}
void MinHeap::deleteMin() {
    //即刪掉最頂上的
    if (curlen > 0) {
        heap[0] = heap[curlen - 1];//用最后一個替代
        curlen--;
        shiftDown(0);
    }
    else {
        cout << "the heap is empty!" << endl;
        return;
    }
    
}
void MinHeap::insertElement(int element) {
    if (curlen == MaxLength) {
        cout << "the heap is full!" << endl;
    }
    else {
        heap[curlen] = element;
        curlen++;
        shiftUp(curlen-1);
    }
}

Heap Sort堆排序

比如就用上面的最小堆咐汞,每次都輸出最頂上的值(一定是最小值),直到刪完堆

//給MinHeap加了兩個函數(shù)
    int getCurLen() { return curlen; }
    int topMin() { if (curlen > 0)return heap[0]; else return -1; }
class HeapSort
{
public:
    HeapSort(MinHeap heap) {
        while (heap.getCurLen() >0) {
            cout << heap.topMin() << " ";
            heap.deleteMin();
        }
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儒鹿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子植阴,更是在濱河造成了極大的恐慌圾浅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨撇,死亡現(xiàn)場離奇詭異府寒,居然都是意外死亡报腔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門纤房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翻诉,“玉大人,你說我怎么就攤上這事碰煌。” “怎么了蛾派?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眯杏。 經(jīng)常有香客問我壳澳,道長,這世上最難降的妖魔是什么巷波? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任褥紫,我火速辦了婚禮,結(jié)果婚禮上髓考,老公的妹妹穿的比我還像新娘。我一直安慰自己儡炼,他們只是感情好查蓉,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妹田,像睡著了一般鹃共。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霜浴,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天阴孟,我揣著相機與錄音,去河邊找鬼永丝。 笑死,一個胖子當(dāng)著我的面吹牛凌蔬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砂心,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼辩诞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了译暂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤崎脉,失蹤者是張志新(化名)和其女友劉穎伯顶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭衩,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灶体,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掐暮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝎抽。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖路克,靈堂內(nèi)的尸體忽然破棺而出樟结,到底是詐尸還是另有隱情,我是刑警寧澤衷戈,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布狭吼,位于F島的核電站,受9級特大地震影響殖妇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜破花,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望座每。 院中可真熱鬧前鹅,春花似錦、人聲如沸峭梳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捂寿,卻和暖如春口四,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秦陋。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工蔓彩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驳概。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓赤嚼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顺又。 傳聞我的和親對象是個殘疾皇子更卒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容