堆是一種資料結構,底層是一種陣列物件,它可以被視為一棵完全二叉樹結構
最大堆:每個父節點的都大於孩子節點; 最小堆:每個父節點的都小於孩子節點。
如圖所示是個大堆,只能保證父節點比孩子節點大。所以下標為0是整個堆最大的,但無法確定下標為1,2的資料哪個更大
思想:從第乙個非孩子節點的下標開始向下調整,保證父節點大於子節點否則交換。(大堆),小堆與之相反,所以,這裡用到仿函式和模板的模板引數,使得**能夠復用,根據傳的引數決定是大堆還是小堆,此處就體現出了c++的優勢。若是c的話,這裡只能老老實實把相似的**再寫一遍。
#include#include#includeusing namespace std;
templatestruct grearer
};templatestruct less
};template> //模板的模板引數,預設值為大於
class heap
heap(t* a, size_t size) //建堆
for (int i = (size - 2) / 2; i >= 0; i--) //從最後乙個非葉子節點向下調整
}void push(const t& x)
void pop()
size_t size() //堆節點個數
const t& top() //堆的首個資料
bool empty() //堆是否為空
protected:
void _ajustup(int root) //向上調整
else
child = parient;
parient = (child - 1) / 2;
} }void _ajustdown(int root) //向下調整
//if (_a[parient] < _a[child])
if (com(_a[child], _a[parient]))
parient = child;
child = 2 * parient + 1;
} }private:
vector_a;
};
template>
class priorityqueue //優先順序佇列
void pop()
size_t size()
const t& top()
bool empty()
private:
heap_h;
};void test()
; heap> hp(a, 10);
hp.push(30);
hp.pop();
}void testpriority() //測試優先順序佇列
if (a[parient] < a[child])
parient = child;
child = 2 * parient + 1; }}
void heapsort(int* a, size_t size)
for (size_t i = 0; i < size; i++)
//return a; }
void testheapsort()
; heapsort(a, 10);
}
如1億個數中找出最大的前100個數 (1億記憶體放不下)。
類似的題就可以用堆來解決。從1億數中取出100個數建立乙個100數的小堆,從硬碟乙個個讀取資料,若讀出的數比下標為0(堆裡最小的數)大,則插入堆,否則丟棄,最後這100個資料的堆儲存的就是這1億個數裡面最大的前100個。
資料結構 優先順序佇列(堆)
一 堆 0 預備知識 使用陣列儲存二叉樹結構,方式即將二叉樹用層序遍歷方式放入陣列中。這種方式的主要用法就是堆的表示。在陣列中 左孩子 left 下標 2 parent 1 右孩子 right 下標 2 parent 2 雙親 parent 下標 child 1 2 1 堆的概念 堆在邏輯上是乙個完...
資料結構篇 優先順序佇列(堆)
優先順序佇列,也叫二叉堆 堆 不要和記憶體中的堆區搞混了,不是乙個東西,乙個是記憶體區域,乙個是資料結構 堆的本質上是一種完全二叉樹,分為 均以大根堆為例 堆本質上是一顆完全二叉樹,使用陣列進行儲存,從 a 1 開始儲存,這樣對於下標為 k 的結點 a k 來說,其左孩子的下標為 2 k 右孩子的下...
優先順序佇列(堆實現)
一 優先順序佇列定義 二 方法實現 獲得最大元素方法 去掉最大元素方法 修改優先順序方法 新增節點 三 實現 用堆實現乙個優先順序佇列 主要是新增 修改 刪除節點 節點具有唯一性 author hhf 2014年11月28日 public class priorityqueue 返回優先佇列中優先順...