给出一种非排序的方法,复杂度为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))