資料結構 堆,堆實現優先順序佇列,堆排序

2021-07-23 15:05:08 字數 1884 閱讀 9348

堆是一種資料結構,底層是一種陣列物件,它可以被視為一棵完全二叉樹結構

最大堆:每個父節點的都大於孩子節點; 最小堆:每個父節點的都小於孩子節點。

如圖所示是個大堆,只能保證父節點比孩子節點大。所以下標為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 返回優先佇列中優先順...