返回乱序数组中第k大的数
阅读原文时间:2021年04月20日阅读:1

类似于快速排序,执行一次快速排序之后,每次只选择一部分继续执行快速排序,直到找到第K大个元素为止,这个元素在数组位置后面的元素即为所求。
利用快速排序子过程的返回哨兵的位置,将哨兵的序号和k - 1进行比较
时间复杂度:O(n)

public class ChangeQuickSort {
    public static int sort(int arr[], int low, int high){
        if(low > high)
            return -1;
        int key = arr[low];
        while(low < high){
            while(arr[high] >= key && low < high){
                high--;
            }
            arr[low] = arr[high];
            while(arr[low] <= key && low < high){
                low++;
            }
            arr[high] = arr[low];
        }
        arr[high] = key;
        return high;


    }
    public static int kMax(int arr[], int low, int high, int k){
        if(low > high)
            return -1;
        int index = sort(arr, low, high);
        if(index == k-1) {
            return arr[index];
        }else if(index < k-1){
            return kMax(arr, index + 1, high, k);
        }else if(index > k-1){
            return kMax(arr, low, index -1, k);
        }
        return -1;

    }
    public static void main(String[] args){
        int[] arr = { 5, 8, 7, 2, 3, 20, 9};
        System.out.print(kMax(arr, 0, arr.length-1, 5));
    }

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器