题目描述:力扣

思路:快速排序的变形,不需要完全排序

由partition函数返回的下标将数组分成2部分,前边大于等于下标元素,后边小于等于下标元素,

当该下标等于K-1时(因为数组下标是从0开始的,所以是K-1),直接返回数组的前K个元素;

当返回的下标大于K-1时,只需要对下标前部分进行排序,后部分元素不需要;

当返回的下标小于K-1时,需要对后部分进行排序,前面的不需要;

在Partition函数中需要注意的是以第一个元素为基准时,先进行的是从后往前遍历,找到小于基准值的元素,将其值赋给low指向的位置,再进行从前向后的遍历,找到大于基准值的元素,将其值赋给high指向的元素。 

class Solution {
    public  int[] getLeastNumbers(int[] arr, int k) {
        if(arr.length==0 || k == 0)
            return new int[]{};
		return quickSort(arr, 0, arr.length-1, k-1);
    }
	
	public int[] quickSort(int[] arr , int low , int high, int k){
		int i = partition(arr,low,high);
		if(i==k){
			return Arrays.copyOf(arr,i+1);
		}
		if(i>k){
			return quickSort(arr, low, i-1,k);
		}
		else{
			return quickSort(arr , i+1, high ,k);
		}
	}
	public int partition(int[] arr, int low, int high){
		int base = arr[low];
		while(high>low){
			while(high > low && arr[high]>=base){
				high--;
			}
            arr[low]=arr[high];
            while(high > low && arr[low]<=base){
				low++;
			}
            arr[high]=arr[low];
		}
		arr[low]=base;
		return low;
	}

}