📜  QuickSelect(一个简单的迭代实现)(1)

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

QuickSelect(一个简单的迭代实现)

快速选择(QuickSelect)是一种基于快速排序的线性时间复杂度选择算法,用于在未排序的数组中查找第k小的元素。

实现步骤
  1. 选取数组中的一个轴(称为枢纽元),可以是任意一个元素
  2. 利用快速排序中的分治思想,将数组分为两部分:小于等于枢纽元的元素和大于枢纽元的元素
  3. 根据第k小元素的位置选择要递归搜索的那一部分
  4. 重复步骤2和3,直到找到第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),因为这个算法是在原始数组上操作的。