package com.atzhanyuan.java;
/**
* 最快效率求出乱序数组中第k小的元素:
* 递归思想
* 快速排序——双向扫描法
*
* @author hylstart
* @create 2022-02-07 13:29
*/
public class Case08_最快效率求出乱序数组中第k小的元素 {
public static void main(String[] args) {
int[] num = {2,5,7,3,8,0,24,78};
int k = selectK(num, 0, num.length - 1, 2);
System.out.println(k);
}
static int selectK(int[] A, int p, int r, int k){
int q = partition(A, p, r); //主元的下标
int qk = q - p + 1; //主元是第几个元素
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 pivot = A[p]; //确定主元的值
int left = p + 1; //左指针
int right = r; //右指针
while (left <= right){
while (left <= right && A[left] <= pivot)
left++;
while (left <= right && A[right] >= pivot)
right--;
if (left < right)
swap(A, left, right);
}
swap(A, p, right);
return right;
}
static void swap(int[] a, int b, int c){
int temp = a[b];
a[b] = a[c];
a[c] = temp;
}
}
Case07_最快效率求出乱序数组中第k小的元素
于 2022-02-07 13:48:10 首次发布