📅  最后修改于: 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。