寻找平面上最近的点对

#include 
#include 
#include 
#define MAX_DIS 65536

struct point{
    int x;
    int y;
};

char result[64]="\0";

int cmp_x(const void * p1, const void * p2)
{
    if(((struct point *)p1)->x==((struct point *)p2)->x)
        return ((struct point *)p1)->y-((struct point *)p2)->y;
    else
        return ((struct point *)p1)->x-((struct point *)p2)->x;
}

int cmp_y(const void * p1, const void * p2)
{
    if(((struct point *)p1)->y==((struct point *)p2)->y)
        return ((struct point *)p1)->x-((struct point *)p2)->x;
    else
        return ((struct point *)p1)->y-((struct point *)p2)->y;
}

double min(double x, double y)
{
    if(xx-p2->x)*(p1->x-p2->x)+(p1->y-p2->y)*(p1->y-p2->y));
}


void generate_points(struct point * P, int n)
{
    int i;
    for(i=0;ix==p2->x)&&(p1->y==p2->y))
        return 1;
    else
        return 0;
}

void brute_force(struct point * x,int n)
{
    int i,j;
    double dis;
    double min_dis=MAX_DIS;
    int p1,p2;
    for(i=0;irmin)
        {
            min_dis=rmin;
        }
        else
        {
            strcpy(result,temp);
        }
        //printf("lr min %s, dis = %f\n", result,min_dis);

        struct point * op=(struct point *)malloc(sizeof(struct point)*(t-s+1)); //备选数组
        int l3=0;
        for(i=0;i

采用的是《算法导论》上预排序+分治的算法,时间复杂度为O(nlogn)。

实现过程中遇到了一点问题:在根据集合X 选取集合Y中元素时,如果X[m]的横坐标和其他点重复时,选取会遇到问题。所以,我将预排序时排序标准修稍微修改了一下,测试结果没有问题,改掉了原有的BUG。

如果有问题,还请指正。

你可能感兴趣的:(c,c++,数据结构)