求第k小的数(利用快排思想)

129 阅读1分钟

题目分析

暴力求解是直接使用sort(库函数排序,默认也是快排)直接将数组排序好,然后直接用index,时间复杂度为O(nlogn)

由于题目有时间限制,则要进行时间优化,那就是利用快排的思想可以做到时间复杂度达到O(n)

实现思路

快排的实现是随机选择一个基数(一般选用第1个),将比基数小的移动到左边,比基数大的移动到右边。然后再接着递归左边和右边,最后将数组排序好。

本题目实现思路是,选用同样的基数,将比基数小的移动到左边、比基数大的移动到右边,然后的判断基数最终所在位置(因为基数所在为和排序好位置不变),如果基数大于k,则递归左边,反之递归右边。直至k的值和基数重合

实现代码如下(经过快排的小改动)

    int k;
    static void swap(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public int findKthLargest(int[] nums, int k) {
        this.k = nums.length - k;
        QSort(nums,0,nums.length-1);
        return nums[this.k];
    }

    void QSort(int[] a, int left, int right){
        if(left < right){
            int low = left;
            int high = right+1;
            int pivot = a[low];

            while(low < high){
                while(low < right && a[++low] <= pivot);
                while (high > left && a[--high] >= pivot);

                if(low < high) swap(a, low, high);
            }
            swap(a,left,high);
            System.out.println(low+" "+high);
            if(high == k) return;
            if (high > k) QSort(a, left, high-1);
            else QSort(a, high+1, right);
        }
    }