📜  使用快速选择算法的未排序数组的中位数(1)

📅  最后修改于: 2023-12-03 15:36:39.492000             🧑  作者: Mango

使用快速选择算法的未排序数组的中位数

快速选择算法是选择排序的一种变体,用于查找未排序数组中第K小(或第K大)的元素。在这里,我们将探讨如何使用快速选择算法找到未排序数组的中位数。

什么是中位数?

中位数是排序数组中位于数组中间的数。对于有偶数个元素的数组,中位数是中间两个元素的平均数。例如,对于数组[1, 2, 3, 4, 5],中位数为3。对于数组[1, 2, 3, 4, 5, 6],中位数为(3+4)/2=3.5。

快速选择算法

快速选择算法的基本思想是:选择一个枢轴元素,将大于枢轴的元素放到右边,小于枢轴的元素放到左边,然后递归地对左右子数组进行相同的操作,直到找到第K小的元素。

以下是快速选择算法的Python代码实现:

def quickselect(arr, k):
    if len(arr) == 1:
        return arr[0]
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    mid = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    if k < len(left):
        return quickselect(left, k)
    elif k < len(left) + len(mid):
        return mid[0]
    else:
        return quickselect(right, k - len(left) - len(mid))
找到中位数

对于未排序的数组,我们可以使用快速选择算法找到中位数。如果数组长度为奇数,则中位数为数组中的第 len(arr) // 2 个元素;如果数组长度为偶数,则中位数为数组中第 len(arr) // 2 个元素和第 len(arr) // 2 - 1 个元素的平均值。

以下是Python代码实现:

def find_median(arr):
    n = len(arr)
    if n % 2 == 1:
        return quickselect(arr, n // 2)
    else:
        return 0.5 * (quickselect(arr, n // 2 - 1) + quickselect(arr, n // 2))
示例

假设我们有一个未排序的数组arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]。使用上述代码来找到中位数:

print(find_median(arr))  # 输出 4.0

数组的中位数为4.0。