1. 程式人生 > >無序數組的中位數

無序數組的中位數

ica .py auth 不能 check rap graph tac 數據

無序數組的中位數

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

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

# @Time : 2019/4/22 10:42 AM
# @Author : George
# @File : main7.py
# @Contact : [email protected]


def heapify(seq, start, end):
"""
找出從start到end的範圍內的最小值,放在堆頂的位置
:param seq:
:param start:
:param end:
:return:

"""
# start結點的左右子結點
left, right = 2 * start + 1, 2 * (start + 1)
mi = start
# 從左右子結點中選出最小值
if left < end and seq[mi] > seq[left]:
mi = left
if right < end and seq[mi] > seq[right]:
mi = right
if mi != start:
# 找到最小值後調整位置
seq[start], seq
[mi] = seq[mi], seq[start]

heapify(seq, mi, end)


def find_mid_num(nums):
heap_num = len(nums)//2
heap = nums[:heap_num+1]

# 建立最小堆
start, end = len(heap) // 2 - 1, len(heap)
for i in range(len(heap)//2-1, -1, -1): # 前n/2個元素建堆
heapify(heap, i, end)

# 將原數組後面一般的數據一一和堆頂進行比較,大於堆頂則替換掉

# 原理就是替換掉一般的數值,剩下的堆頂就是中位數
for j in range(heap_num + 1, len(nums)):
if nums[j] > heap[0]:
# 堆頂被替換掉
print ‘堆頂%s被替換成%s‘ % (heap[0], nums[j])
heap[0] = nums[j]
heapify(heap, 0, end)

# 奇數時是最中間的數,偶數時是最中間兩數的均值
return heap[0] if len(nums) % 2 else (heap[0] + min(heap[1], heap[2])) / 2.0

無序數組的中位數