#include<iostream>
#include<float.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct node {
double x,y;
int i;
};
int change[1005];
double dx1,dy1,dx2,dy2;
bool cmp(node m,node n) {
return m.x<n.x;
}
double dis(node p1,node p2) {
double s=(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
return sqrt(s);
}
int point1=-1,point2=-1;
void merge(node A[],int x,int y,int m,int n) {
int a=x;
int b=m;
int cnt=x;
node *t=new node[n-x+1];
for(int i=x; i<=n; i++) {
t[i-x].x=A[i].x;
t[i-x].y=A[i].y;
t[i-x].i=A[i].i;
}
while(a<=y&&b<=n) {
if(t[a-x].y>t[b-x].y) {
A[cnt].x=t[b-x].x;
A[cnt].y=t[b-x].y;
A[cnt].i=t[b-x].i;
change[b]=cnt;
cnt++;
b++;
} else {
A[cnt].x=t[a-x].x;
A[cnt].y=t[a-x].y;
A[cnt].i=t[a-x].i;
change[a]=cnt;
cnt++;
a++;
}
}
while(a<=y) {
A[cnt].x=t[a-x].x;
A[cnt].y=t[a-x].y;
A[cnt].i=t[a-x].i;
change[a]=cnt;
cnt++;
a++;
}
while(b<=n) {
A[cnt].x=t[b-x].x;
A[cnt].y=t[b-x].y;
A[cnt].i=t[b-x].i;
change[b]=cnt;
cnt++;
b++;
}
delete []t;
}
double mindis(node point[],int left,int right) {
if(left==right) {
return DBL_MAX;
}
else {
int mid=(left+right)/2;
double d1=mindis(point,left,mid);
int p1=point1,p2=point2;
double d2=mindis(point,mid+1,right);
int p3=point1,p4=point2;
double dmin=min(d1,d2);
if(d1<d2) {
point1=p1;
point2=p2;
} else {
point1=p3;
point2=p4;
}
merge(point,left,mid,mid+1,right);
point1=change[point1];
point2=change[point2];
for(int i=left; i<=right; i++) {
for(int j=i+1; j<left+10&&j<=right; j++) {
double dd=dis(point[i],point[j]);
if(dd<dmin) {
dmin=dd;
point1=i;
point2=j;
}
}
}
cout<<"point1和2:"<<point1<<' '<<point2;
dx1=point[point1].x;
dy1=point[point1].y;
dx2=point[point2].x;
dy2=point[point2].y;
cout<<"dx1:"<<dx1<<" "<<dy1 ;
cout<<"dx2:"<<dx2<<" "<<dy2 ;
cout<<"hello"<<endl;
return dmin;
}
}
int main() {
int n=8;
node point[n];
point[0].x=-4;
point[0].y=1;
point[0].i=0;
point[1].x=-3;
point[1].y=2;
point[1].i=1;
point[2].x=-2;
point[2].y=4;
point[2].i=2;
point[3].x=-2.8;
point[3].y=2.4;
point[3].i=3;
point[4].x=1;
point[4].y=4;
point[4].i=4;
point[5].x=2;
point[5].y=2;
point[5].i=5;
point[6].x=2.5;
point[6].y=1.5;
point[6].i=6;
point[7].x=4;
point[7].y=4;
point[7].i=7;
sort(point,point+n,cmp);
double d=mindis(point,0,7);
cout<<point[point1].i<<": "<<"("<<point[point1].x<<","<<point[point1].y<<")"<<endl;
cout<<point[point2].i<<": "<<"("<<point[point2].x<<","<<point[point2].y<<")"<<endl;
cout<<"最小距离为:"<<d;
return 0;
}