对于给定的包含n个元素的数组,要求从中找出第k小的元素
输入:第一行是整数n和k,第二行是n个整数
输出:第k小的元素
输入样例:
7 3
4 59 7 23 61 55 46
输出样例:23
思路:结合快速排序算法,排序后分界值左边有n个元素,
(1).n=k-1,则分界值即为结果
(2).n<k-1 则继续在右子集中查找,k变为k-(i-left+1)(减去包括分界值和左子集的元素个数)
(3).n>k-1 继续在左子集中查找
代码:
package 测试;
import java.io.*;
import java.util.Scanner;
public class 快速排序求数组中第n小的元素 {
static int[]aim;
static int n,k;
static int f(int left,int right,int k){
int i = left,j = right;
int b = aim[left];
while(i<j){
//从右侧扫描
while(i<j && aim[j]>=aim[i]) j--;
if(i<j){
int e = aim[i];
aim[i] = aim[j];
aim[j] = e;
}
//从左侧扫描
while(i<j && aim[i]<=aim[j])i++;
if(i<j){
int ee = aim[j];
aim[j] = aim[i];
aim[i] = ee;
}
}
if(i+1-left == k)return b;
else if(i+1>k) return f(left,i-1,k);
else return f(i+1,right,k-i+left-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
aim = new int[n];
for(int i=0;i<aim.length;i++)
aim[i] = sc.nextInt();
System.out.println(f(0,aim.length-1,k));
}
}