Quick select

我們要從 array 裡找第 k 大的數時,可以用 quick select

一定要注意題意,第 k 大不是第 k 個....所以可以傳第 array.length - k 大的參數

這樣就可以用跟 quick sort 一樣的方式

也就是 quick sort 的 partition部分,

為什麼呢?因為當我們選定一個 pivot時,去做左右分堆,那麼 pivot 左邊一定都比 pivot 小,

所以當分完堆之後看看 pivot 的位置是不是 k,如果是就找到了第 k 大的數

比 k 小那我們往左邊繼續找

// pass A.length - k as k
public int quickSelect(int[] A, int start, int end, int k) {
    if (start >= end) {
        return A[k];
    }

    int left = start, right = end;
    int pivot = A[(start+end)/2];

    while (left <= right) {
        while (left <= right && A[left] < pivot) {
            left++;
        }
        while (left <= right && A[right] > pivot) {
            right--;
        }
        if (left <= right) {
            int temp = A[left];
            A[left] = A[right];
            A[right] = temp;
            left++;
            right--;
        }
    }

    if (k <= right)
        return quickSelect(A, start, right, k);
    if (k >= left)
        return quickSelect(A, left, end, k);
    return A[k];
}

results matching ""

    No results matching ""