//递归分支的思想求最近对问题
public class ClosestPair {
public static String closestpair(Point[] p,int start,int end){
if(start<end){
String s1=closestpair(p,start,start+(end-start)/2);
String s2=closestpair(p,start+(end-start)/2+1,end);
String[] res=(s1+","+s2).split(",");//点对及点对间的距离
double[] re=new double[res.length];//转换字符串res
double dis, dis1,dis2;
for(int i=0;i<res.length;i++){
String str=res[i];
if(str!=null)
re[i]=Double.parseDouble(str);
}
dis1=re[re.length/2+re.length%2-1];//第一个最近对的距离
dis2=re[re.length/2+re.length%2+1];//第二个最近对的距离
if(dis1<=dis2) dis=dis1;
else dis=dis2;
for(int i=start;i<=start+(end-start)/2;i++){
if(p[end/2].x-dis<=p[i].x){
for(int j=start+(end-start)/2+1;j<=end;j++){
if(p[j].y<=p[i].y+dis&&p[j].y>=p[i].y-dis&&p[j].x<=p[end/2].x+dis){
dis1=Math.sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y));
if(dis1<dis) {dis=dis1;re[0]=i;re[1]=j;re[2]=dis;s1=i+","+j+","+dis;}
}
}
}
}
//System.out.println("最近对为: "+s1);
//System.out.println("最近对为: ("+p[(int)re[0]].x+","+p[(int)re[0]].y+")-->("+p[(int)re[1]].x+","+p[(int)re[1]].y+") 距离为:"+re[2]);
return s1;
}
else return start+","+"65535";//当有一个点的时候设他的距离为无限大
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Point[] p=new Point[]{new Point(1,0),new Point(2,4),new Point(4,7), new Point(10,20),new Point(-1,0)};//Point是自定义类
String[] res=closestpair(p,0,p.length-1).split(",");//返回的最近对由字符串表示,格式为 第一个点的下标,第二个点的下标,距离
double[] re=new double[res.length];//转换字符串res
for(int i=0;i<res.length;i++){
String str=res[i];
if(str!=null)
re[i]=Double.parseDouble(str);
}
System.out.println("最近对为: ("+p[(int)re[0]].x+","+p[(int)re[0]].y+")-->("+p[(int)re[1]].x+","+p[(int)re[1]].y+") 距离为:"+re[2]);
}
}