[面试手撕]如何在不排序的情况下求数组的中位数:[数组]

中位数

http://www.nowcoder.com/questionTerminal/2364ff2463984f09904170cf6f67f69a

给出一种非排序的方法,复杂度为O(NlogN),但在实际执行时要比排序快(因为并不需要全排序)——

找到一组数据的中位数,就是找到第lenth/2的数,因此参考此题即可:

https://www.nowcoder.com/practice/673454422d1b4a168aed31e449d87c00

代码解释参考此篇:

https://blog.nowcoder.net/n/731472d8574c4b32817431a3ec8eb6c2

def find_k(arr, k):
    def split(low, high, k=0):
        if low >= high:
            return arr[low]
        i, j, p = low, high, low
        while i < j:
            while i < j and arr[j] >= arr[p]:  # 找到右边第一个小的
                j -= 1
            while i < j and arr[i] <= arr[p]:  # 找到左边第一个大的
                i += 1
            arr[i], arr[j] = arr[j], arr[i]
        arr[p], arr[j] = arr[j], arr[p]  # 把哨兵和最后一个找到的j对换

        offset = i - low  # 比 arr[i]小的有offset位
        if offset == k - 1:  # 左边有k位则当前即为第k小的
            return arr[i]
        elif offset > k - 1:
            return split(low, i - 1, k)
        else:
            return split(i + 1, high, k - offset - 1)
    return split(0, len(arr) - 1, k)


def find_mid(arr):
    l = len(arr)
    mid_a = find_k(arr, l // 2 + 1)
    return mid_a if l % 2 else (mid_a + find_k(arr, l // 2)) // 2

# ---IO---
n = int(input())
if n>0:
    arr = []
    for i in range(n):
        arr.append(int(input()))
    print(find_mid(arr))
全部评论

相关推荐

_mos_:要不是看评论区我都不知道你要找的是数分
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务