无序数组的中位数

Posted george1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无序数组的中位数相关的知识,希望对你有一定的参考价值。

无序数组的中位数

不能使用排序算法,而且要求时间复杂度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

以上是关于无序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

无序数组中位数

无序数组取中位数

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

怎么在O(N)时间内求一个无序数组的中位数

中位数: 给定一个未排序的整数数组,找到其中位数。

求中位数,O(n)的java实现利用快速排序折半查找中位数