在看一些開源元件的原始碼時,會發現很多的底層地方都會使用到最大堆(最小堆)的資料結構,如 在libevent中維護超時事件就用到了最小堆的結構,可見,這種資料結構的重要性。
最大堆:根結點的鍵值是所有堆結點鍵值中最大者。
最小堆:根結點的鍵值是所有堆結點鍵值中最小者。
堆,最重要的乙個過程就是重建的過程,當有新的資料加進來或者移除時,都會對堆進行一次重建,最大堆也是如此:
1.當彈出堆頂元素時,會將末尾元素放到堆頂,依次向下與 下層子節點比較,若比子節點小,則交換,繼續向下比較,直到調整好順序。
2. 當有新元素新增時,先將元素放到末尾,依次向上與父節點比較,若比父節點大,則交換,繼續向上比較,直到調整好順序
/*************
@author xl
@date 2018/08/28
**/#ifndef _maxheap_h
#define _maxheap_h
#include #include using namespace std;
// *最大堆的實現,二叉樹用陣列來表示
templateclass maxheap
;templatemaxheap::maxheap(const t* arr,const int& size)
for(int i=m_size/2-1; i>=0; i--) }
templatemaxheap::~maxheap()
//push元素到堆底,並向上重建堆
templatevoid maxheap::push(const t& val)
else
printf("capacity is full.\n");
}//彈出堆頂元素,並向下重建堆
templateint maxheap::pop()
else
printf("size is empty.\n");
}templatevoid maxheap::sift_down( int index)
else
}heap[(index-1)/2] = temp; //將原值(小值)賦給處理結束的地方,完成down操作 }}
templatevoid maxheap::sift_up( int index)
heap[index] = temp; //將大值賦給父節點,完成up操作 }}
templatevoid maxheap::input()
; maxheapmax_heap(array,10);
max_heap.input();
max_heap.push(80);
max_heap.input();
max_heap.pop();
max_heap.input();
return 0;
}
結果如下:
C 最大堆實現
max heap.h pragma once include template class max heap node heap 最大堆 uint32 t max size 最大儲存數 uint32 t size 儲存數 擴容 void expansion 刪除指定下標節點 void del nod...
c 最大堆的演算法實現
堆的資料結構是一種陣列,也可以說堆是一種有個性的陣列,他可以被視為一顆完全二叉樹 也有可能是滿二叉樹 任一節點的值均大於等於他左右孩子節點的值,其中堆頂的值最大 根節點 左孩子節點 2 父節點 1 右孩子節點 2 父節點 2 父節點 孩子節點 1 2 堆的應用場景 從很多個數中找出最大的前k個數 最...
最小堆 最大堆的實現 c
最小堆 templateclass minheap int size const t min minheap insert const t x minheap deletemin t x void initialize t a,int size,int arraysize void deactiva...