📜  java中第k个最小元素的快速选择方法(1)

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

Java中第k个最小元素的快速选择方法

在Java中,有一个经典算法称为快速选择算法,它可以用来找出一个无序数组中的第k个最小元素。其时间复杂度为O(n),比排序更快,因为它不需要对整个数组进行排序。

快速选择算法的基本思想

快速选择算法使用的是快速排序算法中的分治思想,通过将数组分为两个部分,将目标元素与中间元素进行比较,然后根据比较结果缩小搜索范围,不断重复此过程,直到找到目标元素为止。

具体步骤如下:

  1. 以数组中的第一个元素为pivot。
  2. 将数组中所有小于pivot的元素移动到pivot左侧,将所有大于pivot的元素移动到pivot右侧。
  3. 在数组左半部分的子数组中查找第k个最小元素,如果它比pivot小,那么就在左半部分继续查找,否则在右半部分查找。
  4. 重复第2,3步,直到找到第k个最小元素。
Java实现

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

public static int quickSelect(int[] nums, int k) {
    if (nums == null || nums.length < k) {
        throw new IllegalArgumentException("Invalid input!");
    }
    
    return quickSelect(nums, 0, nums.length - 1, k);
}

private static int quickSelect(int[] nums, int left, int right, int k) {
    if (left == right) {
        return nums[left];
    }
    
    int pivotIndex = left + (right - left) / 2;
    pivotIndex = partition(nums, left, right, pivotIndex);
    
    if (k == pivotIndex) {
        return nums[k];
    } else if (k < pivotIndex) {
        return quickSelect(nums, left, pivotIndex - 1, k);
    } else {
        return quickSelect(nums, pivotIndex + 1, right, k);
    }
}

private static int partition(int[] nums, int left, int right, int pivotIndex) {
    int pivotVal = nums[pivotIndex];
    swap(nums, pivotIndex, right);
    int storeIndex = left;
    
    for (int i = left; i < right; i++) {
        if (nums[i] < pivotVal) {
            swap(nums, i, storeIndex);
            storeIndex++;
        }
    }
    
    swap(nums, storeIndex, right);
    return storeIndex;
}

private static void swap(int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

使用方法如下:

int[] nums = {5, 1, 9, 3, 7, 6, 8};
int k = 2;
int kthSmallest = quickSelect(nums, k - 1);
System.out.println("The " + k + "th smallest element is " + kthSmallest);

输出结果为:

The 2th smallest element is 3
总结

快速选择算法是一种快速查找无序数组中第k个最小元素的算法。它不需要对整个数组进行排序,所以时间复杂度为O(n),比排序更快。它具有广泛的应用,例如在计算机图形学和计算机模拟中。