书中第221页。
采用的是快排中的partition函数来帮助
package com.Page1;
import edu.princeton.cs.algs4.StdRandom;
public class Kmin { //找到第k小的元素,即比它小的元素有k个
private static int partition(Type[] a,int lo,int hi)
{
Type x=a[lo];
int i=lo;
int j=hi+1;
while(true)
{
while(less(a[++i],x)) if(i==hi) break;
while(more(a[--j],x)) if(j==lo) break;
if(i>=j) break;
exch(a,i,j);
}
exch(a,lo,j);//注意不是i而是j
return j;
}
public static void exch(Type[] a,int i,int j)
{
Type x=a[i];
a[i]=a[j];
a[j]=x;
}
public static boolean less(Type x,Type y)
{
if(x.key.compareTo(y.key)==-1) //若是小于或等于,则返回true
return true;
else
return false;
}
public static boolean more(Type x,Type y)
{
if(x.key.compareTo(y.key)==1) //若是小于或等于,则返回true
return true;
else
return false;
}
public static Type findKmin(Type[] a,int k,int lo,int hi)
{
if(lo>=hi) return a[lo];
int i=partition(a,lo,hi);
if(i==k) return a[i];
else if(i>k) return findKmin(a,k,lo,i-1);
else return findKmin(a,k-i-1,i+1,hi);
}
public static void main(String[] args)
{
Type[] a=new Type[5];
a[0]=new Type(6);
a[1]=new Type(1);
a[2]=new Type(1);
a[3]=new Type(2);
a[4]=new Type(3);
StdRandom.shuffle(a);//打乱先
Type result=findKmin(a,2,0,a.length-1);
System.out.println(result.key);
}
}