📜  选择算法(1)

📅  最后修改于: 2023-12-03 14:58:01.087000             🧑  作者: Mango

选择算法

选择算法是一种常见的排序算法,主要用于从数组中选择第k小或第k大的元素。它也被称为快速选择,因为它是基于快速排序的思想而来。选择算法的时间复杂度为O(n),与输入数据是否有序无关。

思路

选择算法的思路很简单:从数组中选择一个随机的元素,将数组中比其小的元素放在它的左边,比它大的元素放在右边。然后,我们可以通过比较左右子数组的元素个数来判断需要在左边还是右边继续查找。

代码实现

Python3

import random

def select(nums, k):
    if len(nums) == 1:
        return nums[0]
    pivot = random.choice(nums)
    left = [x for x in nums if x < pivot]
    right = [x for x in nums if x > pivot]
    if k <= len(left):
        return select(left, k)
    elif k == len(nums) - len(right) + 1:
        return pivot
    else:
        return select(right, k - (len(nums) - len(right)))

Java

import java.util.Random;

public class SelectionAlgorithm {
    public static int select(int[] nums, int k) {
        if (nums.length == 1) {
            return nums[0];
        }
        int pivot = nums[new Random().nextInt(nums.length)];
        int[] left = Arrays.stream(nums).filter(num -> num < pivot).toArray();
        int[] right = Arrays.stream(nums).filter(num -> num > pivot).toArray();
        if (k <= left.length) {
            return select(left, k);
        } else if (k == nums.length - right.length + 1) {
            return pivot;
        } else {
            return select(right, k - (nums.length - right.length));
        }
    }
}
性能分析

选择算法的时间复杂度为O(n),因为每次操作都会把数组大小减半,所以最坏情况下的时间复杂度也为O(n)。

应用场景

选择算法可以用于查找第k小或第k大的元素,比如在一个有序数组中查找第k小的元素,或者在无序数组中查找中位数等。