package test;
import java.text.DecimalFormat;
import java.util.Scanner;
class Point {
double x;
double y;
public Point() {
x = 0;
y = 0;
}
}
public class Fenzhifa {
static int n;
static Point[] p;
/*
* 数组的易错处! 1.java中在方法外只能声明域; 2.java中对域的赋值等必须放在方法中 3.注意写法, 声明-> 类型 名称[];
* 初始化-> 名称=new 类型[n] 4.当数组的类型是对象时,要非常注意!
* 创建了一个对象的数组,仅仅是为该数组分配了数份空间,此时每一份空间为Null,
* 但是还并没有为每一份空间创建具体的对象,因此,当具体引用一个数组的一个元素时,
* 需要为这个元素创建该类型的对象,并赋予这个元素,否则易出现空指针异常
*/
public Fenzhifa() {
p = new Point[100];
}
public double Distance(Point a, Point b) {
double distance = 0;
distance = Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
return distance;
}
public int Partition(Point r[], int first, int end) {
int i = first, j = end;
while (i < j) {
while (i < j && r[i].y <= r[j].y)
j--;
if (i < j) {
Point temp = r[i];
r[i] = r[j];
r[j] = temp;
i++;
}
while (i < j && r[i].y <= r[j].y)
i++;
if (i < j) {
Point temp = r[i];
r[i] = r[j];
r[j] = temp;
j--;
}
}
return i;
}
public void QuickSort(Point r[], int first, int end) {
int pivot;
if (first < end) {
pivot = Partition(r, first, end);
QuickSort(r, first, pivot - 1);
QuickSort(r, pivot + 1, end);
}
}
public double shortest(Point s[], int low, int high) {
double d1, d2, d3, d;
int mid, i, j, index;
Point pp[] = new Point[100];
if (high - low == 1)
return Distance(s[low], s[high]);
if (high - low == 2) {
d1 = Distance(s[low], s[low + 1]);
d2 = Distance(s[low + 1], s[high]);
d3 = Distance(s[low], s[high]);
return (d1 < d2) ? (d1 < d3 ? d1 : d3) : (d2 < d3 ? d2 : d3);
}
mid = (high + low) / 2;
d1 = shortest(s, low, mid);
d2 = shortest(s, mid + 1, high);
if (d1 <= d2)
d = d1;
else
d = d2;
index = 0;
for (i = mid; (i >= low) && (s[mid].x - s[i].x < d); i--)
pp[index++] = s[i];
for (i = mid + 1; (i <= high) && (s[mid].x - s[i].x < d); i++)
pp[index++] = s[i];
QuickSort(pp, 0, index - 1);
for (i = 0; i < index; i++) {
for (j = i + 1; j < index; j++) {
if (pp[j].y - pp[j].y >= d) {
break;
}
else {
d3 = Distance(p[i], p[j]);
if (d3 < d)
d = d3;
}
}
}
return d;
}
public static void main(String arg[]) {
int ch = 0;
int i = 0;
Fenzhifa f = new Fenzhifa();
Scanner read = new Scanner(System.in);
System.out.printf("请输入所有点:\n");
while (ch != 1) {
p[i] = new Point();
p[i].x = read.nextDouble();
p[i].y = read.nextDouble();
ch = read.nextInt();
n++;
i++;
}
n = n - 1;
DecimalFormat df = new DecimalFormat("0.00");
System.out.printf("所有点中的最短距离为:");
System.out.printf(df.format(f.shortest(p, 0, n)));
}
}
分治法实现最近对问题
最新推荐文章于 2022-05-28 17:48:19 发布