四 c 中的演算法 排序及相關操作 堆操作

2021-08-06 06:33:06 字數 3132 閱讀 6007

「堆」是一種組織序列元素的方式。堆的內部資料結構是二叉樹。

兩大性質:

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中,鍵與值型別不同,鍵是唯一的,每個鍵只對...