求二维平面最近点对算法; 分治思想; 递归写的好精准,模仿ACM模板写的.;很多细节处理的很漂亮;

#include #include #include #include const int N=100005; const double MAX= 10e100,eps=0.00001; //mark! struct Point { double x,y; int index; }; Point a[N],b[N],c[N]; double closest(Point *,Point *,Point *,int ,int); double dis(Point ,Point); int cmp_x(const void *,const void *); int cmp_y(const void *,const void *); void merge(Point *,Point *,int ,int ,int); inline double min(double ,double ); int main() { int n,i; double d; scanf("%d",&n); while(n) { for(i=0;iq[j].y) { p[k++]=q[j]; ++j; } else { p[k++]=q[i]; ++i; } } while(i<=m) { p[k++]=q[i]; ++i; } while(j<=t) { p[k++]=q[j]; ++j; } } int cmp_x(const void *p,const void *q) { double temp=((Point *)p)->x-((Point *)q)->x; if(temp>0) { return 1; } else if(fabs(temp)y-((Point *)q)->y; if(temp>0) { return 1; } else if(fabs(temp)

 

 

空间非常节约,用了一个额外的数组,每层递归完成数组的划分,回溯归来的时候再合并起来,感觉很通用的思想,以前也见过,这次记忆一下.

 

另外,为了方便划分,对a[]进行了标号,当然b[]也有标号,这样就很容易根据中点index划分数组了,省去了很多很多要考虑的麻烦.

 

另外,浮点数等于不能写==,要

 

这个算法也复习了一下数组的合并,数组的拆分,思想都很标准,实现也很漂亮.

你可能感兴趣的:(编程之美实现代码)