求一个无序数组的中位数,如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。
要求:不能使用排序,时间复杂度尽可能低。
解决方案一:采用堆排序思想
1、将前(n+1)/2个元素调整为一个小顶堆
2、对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素
3、当遍历完所有元素之后,堆顶即是中位数
建一个小顶堆,需要用到STL里面的 priority_queue,priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了