分治法实现最近对问题

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)));

	}

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值