無序數組的中位數

無序數組的中位數

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

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

# @Time   : 2019/4/22 10:42 AM
# @Author : George
# @File   : main7.py
# @Contact : georgewang1994@163.com


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
相關文章
相關標籤/搜索