線性復雜度選出第k小元素、中位數(shù)、最小的k個元素(Java實現(xiàn))

封裝成類:

package com.roc.algorithms.common;

import java.util.Arrays;

/**
 * 選出第k小元素、中位數(shù)、最小的k個元素(線性復雜度)
 *
 * @author imroc
 */
public class Select {


    //選出第k小元素,k為1~a.length
    public static int selectKthMin(int[] a, int k) {
        k--;
        int lo = 0, hi = a.length - 1;
        while (true) {
            int j = partition(a, lo, hi);
            if (j < k) {
                lo = j + 1;
            } else if (j > k) {
                hi = j - 1;
            } else {
                return a[k];
            }
        }
    }

    //選出中位數(shù)(比一半的元素小,比另一半的大)
    public static int selectMid(int[] a) {
        return selectKthMin(a, a.length / 2);
    }

    //選出k個最小元素,k為1~a.length
    public static int[] SelectKMin(int[] a, int k) {
        int lo = 0, hi = a.length - 1;
        while (true) {
            int j = partition(a, lo, hi);
            if (j < k) {
                lo = j + 1;
            } else if (j > k) {
                hi = j - 1;
            } else {
                return Arrays.copyOf(a, k);
            }
        }
    }

    private static int partition(int[] a, int lo, int hi) {
        int i = lo, j = hi + 1;
        while (true) {
            while (true) {
                i++;
                if (i == hi || a[i] > a[lo]) {
                    break;
                }
            }
            while (true) {
                j--;
                if (j == lo || a[j] <= a[lo]) {
                    break;
                }
            }
            if (i >= j) {
                break;
            }
            swap(a, i, j);
        }
        swap(a, lo, j);
        return j;
    }

    private static void swap(int[] a, int i, int j) {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

}

測試:

int[] a = { 9, 0, 6, 5, 8, 2, 1, 7, 4, 3};
System.out.println(Select.selectKthMin(a,1));//第1小元素:0
System.out.println(Select.selectMid(a));//中位數(shù):4
System.out.println(Arrays.toString(Select.SelectKMin(a,5)));//最小的5個數(shù):0~4

輸出:
0
4
[0, 1, 2, 3, 4]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容