線性時間的選擇算法 java版

期望運行時間爲Θ(n)的選擇問題的算法,最壞則爲Θ(n2)

public class RandomizedSelect {
    /**
     * 找到數組a[p...r]中第i個小的元素的值
     * 注意:i的值必須在[1...r-p+1]之間,應定義異常處理,本處省略
     * @param a
     * @param p
     * @param r
     * @param i
     * @return
     */
    public static int randomizedSelect(int[] a, int p, int r, int i) {
        if (p == r)
            return a[p];
        int q = randomized_partion(a, p, r);
        int k = q - p + 1;
        if (k == i)
            return a[q];
        else if (i < k)
            return randomizedSelect(a, p, q - 1, i);
        else
            return randomizedSelect(a, q + 1, r, i - k);
    }
    private static int randomized_partion(int[] a, int p, int r) {
        int i = p + (int) (Math.random() * (r - p));
        Tool.swap(a, i, r);
        return partion(a, p, r);
    }
    private static int partion(int[] a, int p, int r) {
        int x = a[r];
        int i = p - 1;
        for (int j = p; j <= r - 1; j++) {
            if (a[j] <= x) {
                i++;
                Tool.swap(a, i, j);
            }
        }
        Tool.swap(a, i + 1, r);
        return i + 1;
    }
    public static void main(String[] args) {
        int[] a = new int[] { 1, 1, 1, 5, 6, 22, 44, 2, 11, 66 };
        int res = randomizedSelect(a, 0, a.length - 1, 3);
        System.out.println(res);
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章