1.先是快速排序,使第一个关键字找到自己的位置,然后前面是小于自己的数值,后面是大于自己的数值

2.然后通过比较关键字的值和待查找的值的大小,小于就在右边的表寻找(left+1),小于就在左边的表找(right-1)

3.循环下去就逐渐缩小可以找到满足条件的值了

class Solution {
    public int findKthLargest(int[] nums, int k) {
   
    int len=nums.length;
    int left=0;
    int right=len-1;

    int target=len-k;

    while(true){
        int index=partition(nums,left,right);//多次循环,直到找到答案
        if(index==target){
            return nums[index];
        }else if(index<target){
            left=index+1;//<,说明在右边
        }else{
            right=index-1;//说明在左边
        }
    }

    }
/**
     * 在数组 nums 的子区间 [left, right] 执行 partition 操作,返回 nums[left] 排序以后应该在的位置
     * 在遍历过程中保持循环不变量的语义
     * 1、[left + 1, j] < nums[left]
     * 2、(j, i] >= nums[left]
     *
     * @param nums
     * @param left
     * @param right
     * @return
     */

    public int partition(int[]nums,int left,int right){
        int pivot=nums[left];
        int j=left;
        for(int i=left+1;i<=right;i++){
            if(nums[i]<pivot){
                j++;
                swap(nums,j,i); // 小于 pivot 的元素都被交换到前面,大的也换到后面去了
            }
        }
        // 在之前遍历的过程中,满足 [left + 1, j] < pivot,并且 (j, i] >= pivot
        swap(nums,j,left);//这是最终位置的那个数字调换和第一个关键字
        // 交换以后 [left, j - 1] < pivot, nums[j] = pivot, [j + 1, right] >= pivot
        return j;//返回这是第一个关键字的最终位置
    }

    private void swap(int[]nums,int index1,int index2){
        int temp=nums[index1];
        nums[index1]=nums[index2];
        nums[index2]=temp;
    
    }
}