STL堆排序&时间复杂度分析
作者:互联网
1. 逻辑&时间复杂度分析
pop 和 initialize 的时间复杂度请参考:
[DSAAinC++] maxHBLT的合并&初始化&时间复杂度分析
将数组初始化为一棵 max heap, 时间复杂度为 \(O(n)\).
max heap 的 root 必然是所有 node 中最大的.
排序就是利用这个性质, 将 max heap 的 root 不断 pop 出来, 存入结果数组.
每次 pop 完又会构成一个新的 max heap, 一共 pop \(n\) 次.
因此最坏情况下 pop 总步数为:
因此时间复杂度为:
\[O(n) + O(n\log{n}) = O(n\log{n}) \]2. 代码实现(STL)
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> vec{ 10,4,6,26,3,54,7,8,23,2 };
std::make_heap(vec.begin(), vec.end(), std::greater<int>());
std::sort_heap(vec.begin(), vec.end());
for (auto i : vec) { printf("%d ", i); }
std::cin.get();
}
Reference | Data Structures, Algoritms, and Applications in C++, Sartaj Sahni
标签:std,log,STL,复杂度,堆排序,pop,vec,heap 来源: https://www.cnblogs.com/jamesnulliu/p/algoritm_sort_heapsort.html