
代码
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
double p, q, mid;
double *a;
int N;
struct Point
{
double d;
double d1, d2;
};
int Partition(int low, int high)
{
int i = low, j = high + 1;
double x = a[low];
while (1)
{
while (a[++i] < x && i < high)
;
while (a[--j] > x)
;
if (i >= j)
break;
swap(a[i], a[j]);
}
swap(a[low], a[j]);
return j;
}
int GetMid(int l, int r)
{
int mid = (l + r) / 2;
while (1)
{
int pos = Partition(l, r);
if (pos == mid)
break;
else if (pos > mid)
r = pos - 1;
else
l = pos + 1;
}
return mid;
}
Point CPair(int low, int high)
{
Point kua = {0x3f3f3f3f, 0, 0};
if (low >= high)
return kua;
int m = GetMid(low, high);
Point d1 = CPair(low, m);
Point d2 = CPair(m + 1, high);
p = (*max_element(a + low, a + m + 1));
q = (*min_element(a + m + 1, a + high + 1));
kua.d = q - p;
kua.d1 = q;
kua.d2 = p;
return d1.d < d2.d ? (d1.d < q - p ? d1 : kua) : (d2.d < q - p ? d2 : kua);
}
int main()
{
cin >> N;
a = new double[N];
cout << "读取到的一维点个数为:" << N << endl
<< "分别是:";
for (int i = 0; i < N; i++)
{
a[i] = (rand() % 1000 - 100) * 0.01;
cout << a[i] << " ";
}
cout << endl
<< endl
<< endl;
Point res = CPair(0, N - 1);
cout << "最近点对为:" << res.d1 << " " << res.d2 << endl;
cout << "其距离为: " << res.d << endl;
}
运行结果
复杂度分析
