参考链接:双堆维护数组中位数
用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素。
下面是双堆维护中位数的语言描述:
1、初始化的时候设置两个变量分别记录两个堆【左堆和右堆】的元素的个数。
2、取第一个元素d[0]作为初始中位数m。
3、循环后面的每一个元素,如果比m大,则插入到右堆,如果比m小,则插入到左堆。
4、.如果此时最小堆和最大堆的元素个数的差值>=2 ,则将m加入到元素个数少的堆中,然后从元素个数多的堆将根节点赋值到m,最后重建两个最大堆和最小堆,返回到3。
此时,如果想要知道当前的中位数,若左右队的元素个数相等,则输出堆顶元素的平均值,否则输出堆元素个数较大堆的堆顶元素。
C代码实现: