第K个元素
题:以尽量高的效率求出一个乱序数组中按数值大小排序的第K个元素值
思路:
- 对数组进行快速排序分区操作,获取主元位置,确定主元是第几个元素
- 与K进行比较,重复操作
public static int select_k(int[] arr, int p, int r, int k){
int point = partition2(arr, p, r); //主元位置
int qK = point - p + 1; //主元是第几个元素
if(qK == k)return arr[point];
else if(qK>k) return select_k(arr, p, point-1, k);
else { return select_k(arr, point+1,r, k-qK);
}
}
public static int partition2(int arr[], int p, int r) {
int point = arr[p];//主元
int leftP = p+1; //左指针
int rightP = r; //右指针
while(leftP <= rightP) {
while(leftP <= rightP && arr[leftP] <= point) leftP++;
while(leftP <= rightP && arr[rightP] > point) rightP--;
if(leftP<rightP)
swap(arr,leftP,rightP);
}
swap(arr, p, rightP);
return rightP;
}
public static void swap(int[] arr,int a, int b) {
int temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}