如何用快排思想在O(n)内查找第K大元素?(代码实现)

昨天讲了如何实现查找第K大的元素,要求时间复杂度为O(n);

那么就是利用快速排序的算法,今天我就利用java,来实现时间复杂度为O(n),查找第k大的值;

// 找出第k大,就是找出arr.length-k+1小的值;
    @Test
    public void fun1() {
        int[] arr = {1, 2, 7, 4, 4, 5, 6, 2, 11, 5, 6, 3};
        int k = 4;
        int key = findK1(arr, 0, arr.length - 1, arr.length - k + 1);
        System.out.println(key);
    }

    // 通过debug一步一步开执行过程
    private int findK1(int[] arr, int start, int end, int k) {
        int low = start;
        int high = end;
        int key = arr[end];
        while (low != high) {
            while (low < high && arr[low] <= key) {
                low++;
            }
            while (low < high && key <= arr[high]) {
                high--;
            }
            if (low != high)
                swap(arr, low, high);
        }
        swap(arr, low, end);
        if (k == low + 1) {
            return key;
        } else if (low + 1 > k) {
            return findK1(arr, start, low - 1, k);
        } else {
            return findK1(arr, low + 1, end, k);
        }
    }

平均时间复杂度为:O(n)

最大时间复杂度为:O(n^2)

空间复杂度为:O(1)

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/83149727