最近点对问题-分治法C语言代码
时间: 2024-10-23 16:12:07 浏览: 6
最近点对问题(Closest Pair of Points)是一个常见的计算机图形学和算法问题,涉及寻找二维平面上最接近的一对点。解决这个问题通常采用分治法结合排序的思想。以下是基于快速选择算法的一个简化版的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 计算两个点之间的欧几里得距离
double distance(int x1, int y1, int x2, int y2) {
return sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
}
// 快速选择,用于找到数组中间值
int partition(int arr[], int low, int high, int pivot_idx) {
int pivot = arr[pivot_idx];
swap(&arr[low], &arr[pivot_idx]);
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (distance(arr[j], 0, arr[high], 0) < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 分治法解决Closest Pair问题
void closestPairHelper(int arr[], int left, int right, double* result) {
if (left >= right) {
return;
}
// 找到划分点并调整区间
int mid = partition(arr, left, right, (left + right) / 2);
double midDist = distance(arr[mid], 0, arr[right], 0);
// 对左右子区间分别处理
closestPairHelper(arr, left, mid - 1, result);
closestPairHelper(arr, mid + 1, right, result);
// 更新结果
*result = min(*result, midDist);
}
// 主函数
void closestPair(int arr[], int n) {
double closestDist = INFINITY;
closestPairHelper(arr, 0, n - 1, &closestDist);
printf("The closest pair has a distance of %f.\n", closestDist);
}
int main() {
int points[] = {0, 0, 2, 4, 5, 6, 7, 8};
int n = sizeof(points) / sizeof(points[0]);
closestPair(points, n);
return 0;
}
```
这个代码首先计算每个点到原点的距离,并通过快速选择将点按距离进行排序。然后递归地查找左半部分和右半部分的最短距离,最终得到整个数组中最短的距离。
阅读全文