给予一个未排序数组,需要你找出最小的k个值
1.快排,直接给出前k个值
class qksort{
public static int[] topK(int k , int[] arr){
if( k > arr.length) return arr;
quicksort(arr,0,arr.length-1);
retrun Arrays.Copyof(arr,k)
}
private static void quicksort(int[] arr, int l , int r){
if(l >= r) return;
int i = l;
int j = r;
while(i < j){
while((arr[l]<=arr[j])&&(i<j)) j--;
while((arr[l]>=arr[j])&&(i<j)) i++;
swap(arr,i,j);
}
swap(arr,l,i);
quicksort(arr,l,i-1);
quicksort(arr,i+1,r);
}
private static void swap(int[] arr ,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
2.改进一下快排,在排序中,我们将哨兵放到中间时,数组被分为了 [0-mid][mid-arr.length-1]的两份,若此时前面的[0-mid]正好是k 那么我们可以直接返回。
private static int[] TopK(int[] arr, int l, int r,int k) {
//先找到基准 arr[l] 将大于的全放右边 小于的放左边 找
int i = l;
int j = r;
while (i < j){
while ((arr[j] >= arr[l]) && (i < j)) {
j--;
}
while ((arr[i] <= arr[l]) && (i < j)) {
i++;
}
swap(arr,i,j);
}
//将基准扔到中间
swap(arr,l,i);
if (l > k){ return TopK(arr,l,i-1,k);}
if (l < k){ return TopK(arr,i+1,r,k);}
return Arrays.copyOf(arr,k);
}