📌  相关文章
📜  计算选择给定范围内的K个数组元素的方法(1)

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

计算选择给定范围内的K个数组元素的方法

在编程中,经常需要在给定的范围内选择一定数量的数组元素。这个操作可以使用不同的算法来实现,本文将介绍两种常见的算法:选择排序和快速排序。

选择排序

选择排序是最简单的排序方法之一,其基本思想是每次选择当前范围内的最小元素,并将其与数组的第一个元素交换位置,然后缩小选择范围,重复此过程,直到选择了 K 个元素。

下面是使用选择排序实现选择前 K 个元素的示例代码:

public static int[] selectionSort(int[] arr, int k) {
    int[] result = new int[k];
    for (int i = 0; i < k; i++) {
        int minIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
        result[i] = arr[i];
    }
    return result;
}

本算法的时间复杂度为 O(n^2),优化方法是使用堆排序或快速排序。

快速排序

快速排序是一类基于交换的排序算法,其基本思想是选取一个基准值(pivot),将数组分为基准值左右两个子数组,然后递归对每个子数组进行排序。

下面是使用快速排序实现选择前 K 个元素的示例代码:

public static int[] quickSort(int[] arr, int left, int right, int k) {
    int[] result = new int[k];
    if (left >= right) {
        return result;
    }
    int i = left, j = right, pivot = arr[left + (right - left) / 2];
    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i <= j) {
            int temp = arr[i];
            arr[i++] = arr[j];
            arr[j--] = temp;
        }
    }
    if (left + k - 1 <= j) {
        return quickSort(arr, left, j, k);
    }
    if (left + k - 1 >= i) {
        return quickSort(arr, i, right, k - (i - left));
    }
    for (int n = 0; n < k; n++) {
        result[n] = arr[n];
    }
    return result;
}

本算法的时间复杂度为 O(nlogn),优化方法是使用堆排序。