思路同快排一样,先定主元,主元前的数字比主元小,后面的数字比主元大,
如下图所示,“3”是主元。且(主元的下标+1)就是数组中的第(主元的下标+1)元素。
伪代码
selectK(A,p,r,k){
q = partition(A,p,r);//主元下标
qK = q - p + 1; //主元是第几个元素
if(qk == k) return A[q];
else if ( qk > k) {
selectK(A,p,q-1,k);
} else {
selectK(A, q+1, r, k-qK);
}
}
全部代码
static int selectK(int[] A, int p, int r, int k){
int q = partition(A,p,r);//主元下标
int qK = q - p + 1;
System.out.println("qK="+qK);//主元是第几个元素
if(qK == k) return A[q];
else if ( qK > k) {
return selectK(A,p,q-1,k);
} else {
return selectK(A, q+1, r, k-qK);
}
}
static int partition(int[] A, int p, int r){
int paviot = A[p];
int sp = p +1;
int bigger = r;
while(sp <= bigger){
if(A[sp] <= paviot){
sp++;
} else {
int temp = A[sp];
A[sp] = A[bigger];
A[bigger] = temp;
bigger--;
}
}
int temp = A[p];
A[p] = A[bigger];
A[bigger] = temp;
return bigger;
}
public static void main(String[] args) {
int[] arr = {5,9,1,7,8,9,4,2,3};
int a = selectK(arr, 0, arr.length-1, 4);
System.out.println(a);
}