题目描述:
代码如下:
class Solution {
public int[] getLeastNumbers(int[] arr, int k){
if(arr.length==0||k==0){
return new int[]{};
}
//k-1下标
return quickSort(arr,0,arr.length-1,k-1);
}
private int[] quickSort(int []nums,int l,int r,int k){
int partition = partition(nums, l, r);
if(partition==k){
return Arrays.copyOf(nums, partition+1);
}
return partition>k?quickSort(nums, l, partition-1,k):quickSort(nums, partition+1, r,k);
}
//快排切分,返回下标j,使比num[j]小的数都在j的左边,比num[j]大的数都在j的有比那
private int partition(int []nums,int l,int r){
int v=nums[l];
int i=l;
int j=r+1;
while (true){
//从第二个数开始 第一个数是标志值
while (++i<=r&&nums[i]<v);
//从最后一个数开始
while (--j>=l&&nums[j]>v);
//退出循环的条件
if(i>=j){
break;
}
//交换
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
nums[l]=nums[j];
nums[j]=v;
return j;
}
}