不能使用排序演算法,而且要求時間複雜度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]:
# 堆頂被替換掉
'堆頂%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 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...