选择问题是求一个n个数列表的第k个最小元素的问题。

那么如何寻找n个元素中第k个最小元素呢?

package com.liuzhen.chapter4;

public class SelectProblem {
    //快速选择
    /*
     * 参数A:给定随机数数组
     * 参数k:要求输出的第k个最小元素
     * 函数功能:返回数组A的第k个最小元素的值
     */
    public int quickSelect(int[] A,int k){
        int start = 0;
        int end = A.length-1;
        int mid = new MedianProblem().LomutoPartition(A, start,end);
        while(true){
            if(mid > k-1){
                end = mid-1;
                mid = new MedianProblem().LomutoPartition(A, start,end);
            }
            else if(mid < k-1){
                start = mid+1;
                mid = new MedianProblem().LomutoPartition(A, start,end);
            }
            else
                break;
        }
        return A[mid];
    }
    
    public static void main(String[] args){
        SelectProblem test = new SelectProblem();
        int[] A = {4,1,10,8,7,12,9,2,15};
        int result = test.quickSelect(A, 5);
        System.out.println("对数组进行快速选择并执行划分后结果:");
        for(int i = 0;i < A.length;i++)
            System.out.print(A[i]+" ");
        System.out.println("\n"+"进行快速选择后得到数组第5最小元素(从小到大排序):"+result);
    }
}

运行结果:

对数组进行快速选择并执行划分后结果:
2 1 4 7 8 12 9 10 15 
进行快速选择后得到数组第5最小元素(从小到大排序):8