类型的萃取

#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#include<float.h>
#include<string.h>
template<class Type>
void Copy(Type *sd,Type *si,int left,int right)
{
for(int i = left; i<= right; ++i)
{
sd[i] = si[i];
}
}


template<class Type>
void Merge(Type *sd,Type *si,int left,int m,int right)
{
int i=left, j = m+1;
int k=left;
while(i<=m && j<=right)
{
sd[k++] = si[i]<si[j]? si[i++]:si[j++];
}
while(i<=m) { sd[k++] = si[i++];}
while(j<=right) { sd[k++] = si[j++];}
}
template<class Type>
void MergeSort(Type *ar,Type *br,int left,int right)
{
if(left < right)
{
int m = (((right-left)>>1) + left);
MergeSort(ar,br,left,m);
MergeSort(ar,br,m+1,right);
Merge(br,ar,left,m,right);
Copy(ar,br,left,right);
}
}
template<class Type>
void MergeSort(Type *ar,int n)
{
if(ar == NULL || n < 1) return ;
Type *br = new Type[n];
MergeSort(ar,br,0,n-1);
delete []br;
}
///
#define POINTSIZE 1000


const float MAXFLOAT=3.402823466e+38F;


struct PointX
{
float x,y;
int id;
public:
operator float() const 
{
return x;
}
};
struct PointY
{
float x,y;
int xp;
public:
operator float() const
{
return y;
}
};


void Init_Point(PointX ar[],int n)
{
for(int i = 0;i<n;++i)
{
ar[i].id = i;
ar[i].x = rand()%17311 + 23;
ar[i].y = rand()%19111 +17;
}
}
template<class Type>
void Print_Point(Type ar[],int n)
{
for(int i = 0;i<n;++i)
{
cout<<"第 "<<i<<" 点: "<<ar[i].x<<" : "<<ar[i].y<<endl;
}
cout<<endl;
}
float min(float a,float b)
{
return a<b? a:b;
}
float min(float a,float b,float c)
{
return min(a,min(b,c));
}
template<class Type>
inline float distance(const Type &a,const Type &b)
{
float xd = a.x-b.x;
float yd = a.y-b.y;
return (float)sqrt(xd*xd+yd*yd);
}


int num =0;
float closet(PointX X[],PointY Y[],PointY Z[],
int left,int right,PointX &a,PointX &b)
{
num+=1;
float dm=MAXFLOAT,d1=MAXFLOAT,d2=MAXFLOAT;
if(right-left == 0) return MAXFLOAT;
if(right-left==1)
{
float dx = distance(X[left],X[right]);
a = X[left];
b = X[right];
return dx;
}
if(right - left == 2)
{
float d1 = distance(X[left],X[left+1]);
float d2 = distance(X[left+1],X[right]);
float d3 = distance(X[left],X[right]);
if(d1 <= d2 && d1 <=d3)
{
a = X[left];
b = X[left+1];
return d1;
}else if(d2 <=d3)
{
a = X[left+1];
b = X[right];
return d2;
}else
{
a = X[left];
b = X[right];
return d3;
}
}
int mid = (right-left)/2 + left;// X s1 s2
int zs = left;
int zm = mid+1;
for(int i = left; i<=right; ++i)
{
if(Y[i].xp >mid)
Z[zm++] = Y[i]; // s2
else
Z[zs++] = Y[i]; // s1
}
d1 = closet(X,Z,Y,left,mid,a,b);
PointX a2,b2;
d2 = closet(X,Z,Y,mid+1,right,a2,b2);


if(d2 < d1)
{
dm = d2;
a = a2;
b = b2;
}else
{
dm = d1;
}
Merge(Y,Z,left,mid,right);// Y
int k = left;
for(i = left ; i<=right; ++i)
{
if(fabs(X[mid].x - Y[i].x) < dm )
Z[k++] = Y[i];
}// k - left +1;


for(i = left ;i<k;++i)
{
for(int j =i+1;j<k && fabs(Z[i].y - Z[j].y)<dm;++j)
{
float dz = distance(Z[i],Z[j]);
if(dz < dm)
{
dm = dz;
a = X[Z[i].xp];
b = X[Z[j].xp];
}
}
}
return dm;
}


float Cpair2(PointX X[],PointX &a,PointX &b,int n)
{
if(n < 2) return MAXFLOAT;
MergeSort(X,n);
//Print_Point(X,POINTSIZE);
PointY *Y = new PointY[n];
for(int i = 0;i<n;++i)
{
Y[i].x = X[i].x;
Y[i].y = X[i].y;
Y[i].xp = i;
}
MergeSort(Y,n);
PointY *Z = new PointY[n];
float dm = closet(X,Y,Z,0,n-1,a,b);
delete []Z;
delete []Y;
return dm;
}
void main()
{
PointX X[POINTSIZE];
Init_Point(X,POINTSIZE);
//
Print_Point(X,POINTSIZE);
PointX a,b;


X[23].x = 23;
X[23].y = 23;
X[90].x = 24;
X[90].y = 24;
float dmin = Cpair2(X,a,b,POINTSIZE);
cout<<a.id<<" "<<a.x<<" : "<<a.y<<endl;
cout<<b.id<<" "<<b.x<<" : "<<b.y<<endl;
cout<<dmin<<endl;
cout<<num<<endl;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值