#include #include /*1-d closest pairs*/ /*Based on Shamos & Preparata, p. 190*/ #define MAXPOINTS 2001 #define distance(x1,x2) fabs(x1-x2) void quickSelection(Xx,numPoints,middle) float *Xx; int numPoints,middle; /*Does quicksort partitioning until element with indicated final position in sorted array is positioned*/ /*Also repositions Xx with left elements <= median & right elements >= median*/ /*See CLR, p. 154*/ { int p,r,i,j; float x,temp; p=0; r=numPoints-1; for (;px;j--); for (i++;Xx[i]=middle) r=j; else p=j+1; } } void closestPair(Xx,numPoints,closestX1,closestX2,closestDist) float *Xx; int numPoints; float *closestX1,*closestX2,*closestDist; { int i,j,k; float dist; /*When dividing input,the X arrays are simply handled with pointers to the input array*/ float *Xlx,*Xrx; int numPointsL,numPointsR; /*Sizes for the divided input*/ /*The next two declarations are for the results of the recursive calls*/ float closestLx1,closestLx2,Ldistance; float closestRx1,closestRx2,Rdistance; float temp; if (numPoints<=1) { *closestDist=999999999; return; } /*divide*/ numPointsL=(numPoints+1)/2; numPointsR=numPoints/2; /*Compute beginnings of "new" arrays*/ Xlx=Xx; /*Skip over left side elements (ptr arithmetic)*/ Xrx=Xx+numPointsL; /*Reposition elements WRT median*/ quickSelection(Xx,numPoints,numPointsL-1); /*conquer*/ closestPair(Xlx,numPointsL,&closestLx1,&closestLx2,&Ldistance); closestPair(Xrx,numPointsR,&closestRx1,&closestRx2,&Rdistance); /*Use the closer pair*/ if (Ldistance