转载自:http://www.cnblogs.com/lienhua34/archive/2011/12/06/2381299.html
问题:
给定n个int型的数和一个空的集合,每次往集合中插入一个数,每次插入之后给出这个集合的中位数。(中位数的概念是:如果集合有奇数个数,给出排序后处在最中间的那个数;如果是偶数个数,给出排序后最中间两个数的均值。)
1.如果Num < MaxHeapTop,则
1.1 如果MaxHeapNum <= MinHeapNum,将Num插入最大堆;
1.2 如果MaxHeapNum == MinHeapNum + 1,将MaxHeapTop从最大堆中移到最小堆,并将Num插入最大堆。
2.如果MaxHeapTop <= Num <= MinHeapTop,则
2.1 如果MaxHeapNum <= MinHeapNum,将Num插入最大堆;
2.2 如果MaxHeapNum == MinHeapNum + 1,将Num插入最小堆;
3.如果Num > MinHeapTop,则
3.1 如果MinHeapNum <= MaxHeapNum,将Num插入最小堆;
3.2 如果MinHeapNum == MaxHeapNum + 1,将MinHeapTop移到最大堆中,将Num插入最小堆。
在每次插入后,都要根据情况对MaxHeapNum和MinHeapNum进行变更,并将有改动的堆进行堆调整。
上面的插入情况会保证最大堆和最小堆的元素个数差小于1,中位数就只在最大堆和最小堆的顶部元素中产生:如果最大堆和最小堆的元素个数相等,则中位数为最大堆和最小堆的顶部元素的平均值;否则,中位数为元素个数多的那个堆的堆顶元素。
复杂度分析:每次插入元素时的堆调整平均复杂度为O(log(N/2)),插入N次,所以总的复杂度为O(N*log(N/2))。