無序陣列的中位數

2022-01-23 02:08:26 字數 1540 閱讀 5090

不能使用排序演算法,而且要求時間複雜度o(n)。

# -*- coding: utf-8 -*-

​# @time   : 2019/4/22 10:42 am

# @author : george

# @file   : main7.py

# @contact : [email protected]​​

defheapify(seq, start, end):

"""找出從start到end的範圍內的最小值,放在堆頂的位置

:param seq:

:param start:

:param end:

:return:

"""# start結點的左右子結點

left, right = 2

*start

+1, 2

* (start+1)

mi = start

# 從左右子結點中選出最小值

ifleft

<

endand

seq[mi] >

seq[left]:

mi = left

ifright

<

endand

seq[mi] >

seq[right]:

mi = right

ifmi

!= start:

# 找到最小值後調整位置

seq[start], seq[mi] = seq[mi], seq[start]

heapify(seq, mi, end)​​

deffind_mid_num(nums):

heap_num = len(nums)//

2heap = nums[:heap_num+1]

​# 建立最小堆

start, end = len(heap) //2-

1, len(heap)

fori

inrange(len(heap)//2-

1, -

1, -

1):   # 前n/2個元素建堆

heapify(heap, i, end)

​# 將原陣列後面一般的資料一一和堆頂進行比較,大於堆頂則替換掉

# 原理就是替換掉一般的數值,剩下的堆頂就是中位數

forj

inrange(heap_num

+1, len(nums)):

ifnums[j] >

heap[0]:

# 堆頂被替換掉

print

'堆頂%s被替換成%s'

% (heap[0], nums[j])

heap[0] = nums[j]

heapify(heap, 0, end)

​# 奇數時是最中間的數,偶數時是最中間兩數的均值

return

heap[0] if

len(nums) %

2else (heap[0] +

min(heap[1], heap[2])) /

2.0

無序陣列的中位數

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

無序陣列的中位數

參考 中位數,就是陣列排序後處於陣列最中間的那個元素。說來有些麻煩,如果陣列長度是奇數,最中間就是位置為 n 1 2的那個元素。如果是偶數呢,標準的定義是位置為n 2和位置為n 2 1的兩個元素的和除以2的結果,有些複雜。為了解答的方便,我們假設陣列長度暫且都為奇數吧。面試時,大家是不是經常被問到,...

無序陣列求中位數

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...