STL原始碼解析 sort heap

2021-05-26 11:06:52 字數 1620 閱讀 8351

模板函式sort_heap具有如下兩個版本

templatevoid sort_heap(_ranit _first, _ranit _last);

templatevoid sort_heap(_ranit _first, _ranit _last, _pr _pred);
其功能是完成區間 [_first, _last) 內元素的堆排序,第乙個版本採用小於操作符(operator<),

第二個版本採用乙個二元謂詞(binary predicate)。

下面將以第乙個版本的演算法源**進行注釋說明

templateinline

void sort_heap(_ranit _first, _ranit _last)

_sort_heap函式

templateinline

void _sort_heap(_ranit _first, _ranit _last)

pop_heap函式

templateinline

void pop_heap(_ranit _first, _ranit _last)

_pop_heap_0函式

templateinline

void _pop_heap_0(_ranit _first, _ranit _last, _ty *)

_pop_heap函式

templateinline

void _pop_heap(_ranit _first, _ranit _last, _ranit _dest,

_ty _val, _diff *)

_adjust_heap函式

templateinline

void _adjust_heap(_ranit _first, _diff _hole, _diff _bottom, _ty _val)

if (_idx == _bottom)

std::_push_heap(_first, _hole, _top, _val);

}

_push_heap函式

templateinline

void _push_heap(_ranit _first, _diff _hole,

_diff _top, _ty _val)

// 找到不小於 _val 的節點

*(_first + _hole) = _val; // drop _val into final hole

}

至此已完成堆排序,不過使用sort_heap需要注意下面三點

(1)首先把建堆,即呼叫make_heap

(2)由於對原末值的儲存是通過引數值傳遞,如_pop_heap及以後的函式中的引數 _val,因而對於某些複雜的自定義型別將不適用,

即expensive type

(3)sort_heap的時間複雜度為o(nlogn)

STL原始碼解析之heap

include include include heap algorithms using namespace std heap的所有元素都必須遵循特別的完全二叉樹排列規則,所有heap不提供遍歷功能,也不提供迭代器 int main vectorivec ia,ia 9 for int i 0 i...

STL原始碼解析 STL 與 泛型程式設計

物件導向程式設計與泛型程式設計template typename t class vector int ar 6 vector int,allocator int vec ar,ar 6 cout count if vec.begin vec.end notl bind2nd less int 6 ...

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...