算法思路

要找数组中第K大的数,很简单的就是将数组从大到小进行排序,然后输出数组第K个数即可;排序的话我们选择快速排序,简单高效,而且因为是原地排序空间复杂度也低;不同于#排序#中从小到大排序,只要修改partition()方法交换判定条件,即可实现从大到小排序;

算法实现

public class Solution {
    public int findKth(int[] a, int n, int K) {
        quickSort(a, 0, n -1);
        return a[K - 1];
    }

    private void quickSort(int[] A, int L, int R) {
        if (L < R) {
            int p = partition(A, L, R);
            quickSort(A, L, p - 1);
            quickSort(A, p + 1, R);
        }
    }

    private int partition(int[] A, int L, int R) {
        int pivot = A[R];
        int i = L - 1;
        for (int j = L; j < R; j++) {
            if (A[j] >= pivot) {
                swap(A, ++i, j);
            }
        }
        swap(A, i + 1, R);
        return i + 1;
    }

    private void swap(int[] A, int i, int j) {
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
}