堆:實質是一顆完全二叉樹,最大堆的特點:父節點值均大於子節點;最小堆的父節點值均小於子節點;
一般使用連續記憶體儲存堆內的值,因而可以根據當前節點的索引值推斷子節點的索引值:
節點i的父節點為(i-1)/2;
節點j的左子結點:j * 2 + 1;
節點j的右子結點:j * 2 + 2;
以下**實現了最大堆最小堆,當比較函式使用std::greater,得到最大堆,當比較函式使用std::less得到最小堆;
關鍵是考慮清楚小頂堆用於找最大,大頂推用於找最小,其他都簡單。
大最小堆
#pragma once
#include using namespace std;
template void mswap(t &a, t &b)
template >
class maxminheap
; ~maxminheap(void)
;void headadd(t num)
else
};//最大堆排序後得到公升序序列;最小堆排序後得到降序序列
void sort()
}void gethnum(t &n)//獲取最大堆的最小值或者最小堆的最大值
;void heapfixup(int index)
data[index]=tmp;
};//從節點index開始進行向下調整
void heapfixdown(int index, int n)
for (int i = 0 ; i < 20 ; ++i)
test.sort();
for (int i = 0 ; i < 20 ; ++i)
cout
}
最大堆 最小堆Java實現,解決TOP K問題
最大堆,最小堆類似,以下以最小堆為例進行講解。最小堆是滿足以下條件的資料結構 它是一棵完全二叉樹 所有父節點的值小於或等於兩個子節點的值 除了最後一層之外的其他每一層都被完全填充,並且所有結點都保持向左對齊。對於topk問題,解決方法有很多 方法一 對源資料中所有資料進行排序,取出前k個資料,就是t...
最大堆 最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...