std::sort_heap为何破坏堆特性?排序后的序列不属于堆吗?
关于std::sort_heap的堆特性疑问
cppreference说明:
生成的区间不再具备堆特性。
cplusplus说明:
该区间失去了堆的特性。
为什么排序后的序列不再是堆?
首先得搞清楚堆的核心定位:堆是一种部分有序的完全二叉树结构(用数组存储),核心规则是每个父节点和子节点满足固定大小关系——最大堆要求父节点≥子节点,最小堆要求父节点≤子节点。堆的设计目的是快速获取极值(比如最大堆的首元素就是最大值),而非让整个序列完全有序。
而std::sort_heap的作用,就是把一个已经是堆的区间,彻底转换成完全有序的序列(默认升序,也可通过自定义比较器改为降序)。
拿默认的最大堆转升序场景来说:排序后的序列是从小到大依次排列的,完全不符合最大堆的特性(父节点都比子节点小);哪怕你觉得它看起来像最小堆,这也毫无实际意义——因为std::sort_heap的结果是完全有序的,而堆的价值在于“部分有序”带来的高效极值操作,完全有序的序列已经失去了堆作为极值容器的作用,也没法再用push_heap、pop_heap这类堆操作函数处理。
简单说:堆是用来快速拿最值的工具,sort_heap把它变成了彻底排好序的普通序列,自然就不再是堆了。
内容的提问来源于stack exchange,提问作者Kelly Bundy
相关产品推荐
相关产品推荐

