首先将数组nums进行排序,然后找到中间位置的数值
如果数组长度n为奇数,则(n+1)/2处对应值为中位数,如果数组下标从0开始,还需要减去1
如果数组长度n为偶数,则n/2,n/2+1两个位置数的平均值为中位数
假设中位数为x,并采用大小根堆来存储元素
import numpy as np
import heapq
nums = np.random.choice(np.array(20),10,replace=False)
print('数组为',nums)
def findmid(nums):
que_min = list() #小根堆,存储大于中位数的元素
que_max = list() #大根堆,存储小于等于中位数的元素 !python中默认建造小根堆,可以将元素进行取负,来构造大根堆
n = len(nums)
for i in range(n):
if not que_max or nums[i] <= -que_max[0]:
heapq.heappush(que_max,-nums[i])
if len(que_max) > len(que_min)+1:
heapq.heappush(que_min,-que_max[0])
heapq.heappop(que_max)
else:
heapq.heappush(que_min, nums[i])
if len(que_min) > len(que_max):
heapq.heappush(que_max,-que_min[0])
heapq.heappop(que_min)
if n % 2==0:
return (que_min[0] - que_max[0])/2
else:
return que_max[0]
print('数组的中位数为:',findmid(nums))