zoukankan      html  css  js  c++  java
  • 无序数组的中位数

    无序数组的中位数

    不能使用排序算法,而且要求时间复杂度O(n)。

    # -*- 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

  • 相关阅读:
    上下文切换
    NUMA的取舍与优化设置
    KVM CPU线程等学习记录
    openstack cpu pinning
    virt-install详解
    对KVM虚拟机进行cpu pinning配置的方法
    30 个 OpenStack 经典面试问题和解答
    OpenFace Docker 使用简介
    单链表、双链表及单链表的逆序
    Ubuntu14.04.1安装搜狗拼音输入法
  • 原文地址:https://www.cnblogs.com/George1994/p/10749180.html
Copyright © 2011-2022 走看看