题目描述
题解
快速排序:
我们知道快速排序的每一轮,都是找到一个数应该在的位置,左边都是比他小的,右边都是比他大的。所以我们进行快排,当当前坐标等于k - 1的时候,左边的数组就是前k小的数
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
return quick(arr, k, 0, arr.length - 1);
}
public int[] quick(int[] arr, int k, int left, int right){
if (left > right) return new int[0];
int l = left, r = right;
int tmp = arr[left];
while (l < r){
while (l < r && arr[r] >= tmp) r--;
while (l < r && arr[l] <= tmp) l++;
if (l < r){
int x = arr[r];
arr[r] = arr[l];
arr[l] = x;
}
}
arr[left] = arr[l];
arr[l] = tmp;
if (l == k - 1){
int[] res = new int[k];
for (int i = 0; i < k; i++){
res[i] = arr[i];
}
return res;
}else if (l > k - 1){
return quick(arr, k, left, l - 1);
}else{
return quick(arr, k, l + 1, right);
}
}
}