📅  最后修改于: 2023-12-03 15:34:34.963000             🧑  作者: Mango
快速选择(QuickSelect)是一种基于快速排序的线性时间复杂度选择算法,用于在未排序的数组中查找第k小的元素。
下面是一个简单的迭代实现。
def quickselect(arr, k):
left, right = 0, len(arr) - 1
while True:
if left == right:
return arr[left]
pivot_index = left + (right - left) // 2
pivot_index = partition(arr, left, right, pivot_index)
if k == pivot_index:
return arr[k]
elif k < pivot_index:
right = pivot_index - 1
else:
left = pivot_index + 1
def partition(arr, left, right, pivot_index):
pivot_value = arr[pivot_index]
arr[pivot_index], arr[right] = arr[right], arr[pivot_index]
store_index = left
for i in range(left, right):
if arr[i] < pivot_value:
arr[i], arr[store_index] = arr[store_index], arr[i]
store_index += 1
arr[right], arr[store_index] = arr[store_index], arr[right]
return store_index
时间复杂度为O(n),其中n为数组长度。在最坏情况下的时间复杂度为O(n^2),但这种情况比较罕见。
空间复杂度为O(1),因为这个算法是在原始数组上操作的。