資源簡介
使用分治算法實現尋找n個點中最鄰近點的距離的平方。時間復雜度O(nlogn).
代碼片段和文件信息
#include?
#include?
struct?Point_X{????????
float?x;
float?y;
};
struct?Point_Y{????????
int?index;
float?x;
float?y;
};
void?swap(Point_X?*aPoint_X?*b);
int?CountDistance(Point_X?aPoint_X?b);
void?Closest_Pair(Point_X?x[]int?sizePoint_X?&aPoint_X?&bint?&MinDistance);
void?Closest_Pair_Rec(Point_X?x[]Point_Y?y[]int?lowint?highPoint_X?&aPoint_X?&bint?&MinDistance);
void?swap(Point_X?*aPoint_X?*b)
{
????Point_X?temp=*a;
????*a=*b;
????*b=temp;
}
int?CountDistance(Point_X?aPoint_X?b)
{
?????????return?(int)pow(a.x-b.x2)+pow(a.y-b.y2);
}
void?merge(Point_X?L1[]Point_X?L2[]const?int?leftconst?int?midconst?int?right)
{
int?k=0;
for(k=left;k<=right;k++)
L2[k]=L1[k];
int?s1=lefts2=mid+1t=left;//s1s2分別是L2的兩個表的檢測指針t是L1中的存放指針
while(s1<=mid?&&?s2<=right)?//兩個表都不為空時
if(L2[s1].x<=L2[s2].x) //兩個表的表頭元素通過比較把較小的元素加入到存放表L1中
L1[t++]=L2[s1++];
else
L1[t++]=L2[s2++];
while(s1?<=?mid) //若第一個表未檢查完成把已排好序的未加入部分復制到L1中
L1[t++]=L2[s1++];
while(s2?<=?right) //若第二個表未檢查完成
L1[t++]=L2[s2++];
}
void?MergeSort(Point_X?L[]Point_X?L2[]int?leftint?right)
{
if(left>=right)
return;
int?mid=(left+right)/2;?????//從中間劃分為兩個子序列
MergeSort(LL2leftmid); //對左側子序列進行遞歸排序
MergeSort(LL2mid+1right);//對右側子序列進行遞歸排序
merge(LL2leftmidright); //合并
}
void?Closest_Pair(Point_X?x[]int?sizePoint_X?&aPoint_X?&bint?&MinDistance){
????if(size<2)
{
MinDistance=0;
return;
????}
Point_X?*px=new?Point_X[size];
MergeSort(xpx0size-1);
????Point_Y?*y=new?Point_Y[size];
????for(int?i=0;i {????????????????????????
y[i].index=i;
y[i].x=x[i].x;
y[i].y=x[i].y;
????}???
????Closest_Pair_Rec(xy0size-1abMinDistance);
????delete?y;
}
void?Closest_Pair_Rec(Point_X?x[]Point_Y?y[]int?lowint?highPoint_X?&aPoint_X?&bint?&MinDistance){
????Point_X?albl
- 上一篇:C/C++實現FAT文件系統的讀寫
- 下一篇:Qt5Twain.rar
評論
共有 條評論