無序陣列求中位數

2021-09-02 19:31:17 字數 1815 閱讀 3760

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?

如果陣列中元素有奇數個,可以採用這種演算法:

步驟 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+1 <= n-1:

kididx = 2*parentidx+1

if kididx != n-1 and nums[kididx] > nums[kididx+1]:

kididx += 1

if rootval < nums[kididx]:

break

else:

nums[parentidx] = nums[kididx]

parentidx = kididx

nums[parentidx] = rootval

def changetominheap(nums, n):

''' 建立最小堆 '''

for index in range(n//2-1, -1, -1):

filter_up(nums, index, n)

def find_median(nums, n):

assert n%2 == 1

abouthalf = (n+1)//2

changetominheap(nums, abouthalf)

pointer = abouthalf

for index in range(abouthalf, n):

if nums[index] > nums[0]:

nums[0] = nums[index]

changetominheap(nums, abouthalf)

return nums[0]

def test():

nums = list(range(4, 10)) + list(range(0, 4)) + list(range(10, 15))

print('nums:', nums)

assert find_median(nums, 15) == 7

print('pass!')

if __name__ == '__main__':

test()

暫時略。。

無序陣列的中位數;

讓人眼前一亮的演算法!求無序陣列的中位數。

o(n)

無序陣列中求中位數;

【演算法】無序陣列中求中位數;

試用o(n)來實現求出乙個無序陣列的中位數。

求乙個無序陣列的中位數;

求中位數,快速選擇演算法

求無序陣列的中位數

中位數即是排過序後的處於陣列最中間的元素。不考慮陣列長度為偶數的情況。設集合元素個數為n。簡單的想了下 思路1 這個方法不行,因為面試時真正要求是不排序 把無序陣列排好序,取出中間的元素 時間複雜度 採用普通的比較排序法 o n logn 如果採用非比較的計數排序等方法,時間複雜度 o n 空間複雜...

求無序陣列的中位數

中位數即是排過序後的處於陣列最中間的元素。不考慮陣列長度為偶數的情況。設集合元素個數為n。簡單的想了下 思路1 把無序陣列排好序,取出中間的元素 時間複雜度 採用普通的比較排序法 o n logn 如果採用非比較的計數排序等方法,時間複雜度 o n 空間複雜度也是o n 思路2 2.1 將前 n 1...

無序陣列的中位數

題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...