长度为 n 的无序数组,求中位数,如何尽快的估算出中位数,算法复杂度是多少?
算法 1(建立最小堆):
如果数组中元素有奇数个,可以采用这种算法:
步骤 1 :可以将数组的前 (n+1)//2 个元素,建立 1 个最小堆;
步骤 2 :遍历剩余元素,如果剩余元素小于堆顶元素,则丢弃或不作处理;如果剩余元素大于堆顶元素,则将其取代堆顶元素,并将当前堆调整为最小堆。
步骤 3 :返回堆顶元素,即 nums[0],就是所要寻找的中位数。
一点解释:
不管是步骤 1、2 还是整个过程中,最小堆的栈顶元素必然满足:
中位数 >= 最小堆的堆顶元素
例如,[7,8,9,10,11,12,13] 中位数是 10 ,n 等于 7 ,(n+1)//2 等于 4 ,不管是取前 4 个数、后 4 个数、任意 4 个数,构造的最小堆的堆顶元素,最小为 7 ,最大为 10。
因此,小于堆顶元素的元素,必然不可能是中位数,可以直接丢弃;中位数只有可能在最小堆、剩余元素中。
实现:
# coding:utf-8
#from heap_sort import filter_down
def filter_up(nums, p, n):
parentIdx = p
rootVal = nums[parentIdx]
while 2*parentIdx&