📅  最后修改于: 2023-12-03 15:12:05.353000             🧑  作者: Mango
在编程中,经常需要在给定的范围内选择一定数量的数组元素。这个操作可以使用不同的算法来实现,本文将介绍两种常见的算法:选择排序和快速排序。
选择排序是最简单的排序方法之一,其基本思想是每次选择当前范围内的最小元素,并将其与数组的第一个元素交换位置,然后缩小选择范围,重复此过程,直到选择了 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),优化方法是使用堆排序。