一、第k个元素:以尽量高的效率求出一个乱序数组中按数值顺序的第k个元素
乱序数组
法一:利用快速排序,算法时间复杂度O(Nlogn)
法二:利用分区排序法(双向扫描法)
依次与主元比较,比主元大的排在右面不变,比主元小的指针交换位置,得到如下数组
伪代码
selectk(A,p,r,k){
q=partition(A,p,r); //q主元的下标
qk=q-p+1; //主元是第几个元素
if(qk==k) //K为所求元素的值
return A[q]; //利用数组下标返回元素的值
else if(qk>k)
return selectk(A,p,q-1,k);
else
return selectk(A,q+1,r,k-qk) //右半区间,初始下标改变为q+1,返回k的值就为k-qk
}
partition(A,p,r)
代码
package selectk;
public class Selectk {
public static int selectk(int[] A,int p,int r,int k){
int q=partition(A,p,r); //q主元的下标
int qk=q-p+1; //主元是第几个元素
if(qk==k) //K为所求元素的值
return A[q]; //利用数组下标返回元素的值
else if(qk>k)
return selectk(A,p,q-1,k);
else
return selectk(A,q+1,r,k-qk); //右半区间,初始下标改变为q+1,返回k的值就为k-qk
}
private static int partition(int[] a, int p, int r) {
// TODO Auto-generated method stub
return 0;
}
public static void main(String[] args) {
int[]A= {3,9,7,6,1,2};
int k=selectk(A,0,A.length,2);
System.out.println(k);
AssertionError.assertThat(k).isEqualTo(2);
}
}