「堆」是一種組織序列元素的方式。堆的內部資料結構是二叉樹。
兩大性質:
1. 堆的第乙個元素通常是最大的元素
2. 能夠在對數時間內增加或移除乙個元素;
堆的操作演算法:
- push_heap()
- pop_heap()
- sort_heap()
- make_heap()
- 等等
函式模型:
template
< class randomit >
void make_heap( randomit first, randomit last );
template
< class randomit, class compare >
void make_heap( randomit first, randomit last,
compare comp );
說明:
1. 兩個形式都可以將範圍[first,last)內的元素構建成堆。
2. 第乙個形式: 使用預設比較:operator<
3. 第二個形式: 使用的二元比較函式: comp
4. 無返回值
5. 使用堆處理的條件:元素要多餘1個。如果只有乙個元素,沒必要使用堆,也可以認為單個元素就是「堆」。
例子:
----------省略-------------
vector
vec1 = ;
make_heap(vec1.begin(), vec1.end());
輸出結果:
vec1:12
4563
make_heap vec1: 654
123
第乙個元素為最大的元素。
在指定區間內插入乙個元素。新插入的元素放在堆疊的末尾,即尾指標
必須保證區間原有元素是乙個「堆」
函式原型:
template
< class randomit >
void push_heap( randomit first, randomit last );
template
< class randomit, class compare >
void push_heap( randomit first, randomit last,
compare comp );
說明:
1. 插入元素到[first,last)的範圍內部
2. 第一種形式: 使用預設規則operator<
3. 第二種形式: 使用自定義二元比較函式comp
作用是刪除在[first,last)範圍中最大元素。即第乙個元素。剩下的元素成為乙個新的「堆」。
函式原型為:
template
< class randomit >
void pop_heap( randomit first, randomit last );
template
< class randomit, class compare >
void pop_heap( randomit first, randomit last, compare comp );
說明:
1. 第一種形式: 使用預設規則operator<
2. 第二種形式: 使用自定義二元比較函式comp
對齊引數迭代器指定範圍內的[first,last)範圍內的元素進行排序。
函式原型為:
template
< class randomit >
void sort_heap( randomit first, randomit last );
template
< class randomit, class compare >
void sort_heap( randomit first, randomit last, compare comp );
說明;
1. 第一種形式: 使用預設規則operator<
2. 第二種形式: 使用自定義二元比較函式comp
3. 演算法執行後,該區間和內部的元素不在是堆了。
例子:
-------------省略-----------------
vector
vec1 = ;
//建立堆
make_heap(vec1.begin(), vec1.end());
//插入堆
vec1.push_back(10);
push_heap(vec1.begin(), vec1.end());
//移除堆疊的第乙個元素
pop_heap(vec1.begin(), vec1.end());
//出棧後我們可以看到其實容器vector中元素並沒有被移除,
//前面元素為堆,最後乙個元素不為堆,
//因此,我們後面進行的堆操作必須要讓這些元素還是堆,有兩種做法
//一:移除掉最後乙個元素,vec1.push_back()
//第二種做法:就是重新再建堆
make_heap(vec1.begin(), vec1.end());
//排序
sort_heap(vec1.begin(), vec1.end());
-------------省略-----------------
輸出結果為:
vec1:12
4563
make_heap vec1: 654
123 push_back vec1: 654
12310
push_heap vec1: 1056
1234
pop_heap vec1: 654
12310
sort_heap vec1: 123
45610
這裡我們採用第二種做法,可以看出,pop_heap其實未將元素真正的移除。
【但是為什麼操作會破壞堆的結構,我還不知道】
四 c 中的演算法 排序及相關操作 搜尋
在已序區間搜尋指定的元素,搜尋區間必須是有序的 函式原型為 template bool binary search forwardit first,forwardit last,const t value 第二種形式 template bool binary search forwardit fir...
堆的實現及相關操作
堆 是一種特殊的完全二叉樹 大堆 左右孩子結點均小於父親結點 小堆 左右孩子結點均大於父親結點 用順序表來表示堆 typedef int hpdatatype typedef struct heap heap 堆的建立 void heapcreat heap hp,hpdatatype array,...
C 中的容器及相關操作
關聯容器將值與鍵關聯在一起,並使用鍵來查詢值。stl提供了4種關聯容器 set multiset map multimap。set中,可反轉,可排序,鍵與值型別相同,鍵是唯一的,意味著集合中不會有多個相同的鍵。multiset中,可能有多個值的鍵相同。map中,鍵與值型別不同,鍵是唯一的,每個鍵只對...