一维最接近点对(递归分治)

//一维情况下的最接近点对
#include<iostream>
using namespace std;
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#define maxint 1000

template<class Type>
void Swap(Type &a,Type &b){
	Type temp = a;
	a = b;
	b = temp;
}


/*template<class Type>
Type min(Type a,Type b,Type c){
	Type temp = a > b ? b:a;
	return temp < c ? temp:c;

}*/
template<class Type>
int Partition(Type a[],int p,int r){
	int i = p,j = r+1;
	Type x = a[p];
	while(true){
		while(a[++i] < x && i < r);
		while(a[--j] > x);
		if(i >= j)
			break;
		Swap(a[i],a[j]);
	}
	a[p] = a[j];
	a[j] = x;
	return j;
}

template<class Type>
int RandomizedPartition(Type a[],int p,int r){
	int i = p + rand()%(r-p);
	Swap(a[i],a[p]);
	return Partition(a,p,r);
}

template<class Type>
void RandomizedQuickSort(Type a[],int p,int r){
	if(p < r){
		int q = RandomizedPartition(a,p,r);
		RandomizedQuickSort(a,p,q-1);
		RandomizedQuickSort(a,q+1,r);
	}
}

template<class Type>
Type RandomizedSelect(Type a[],int p,int r){
	//返回中位数
	if(p == r)
		return a[p];
	else return a[(p+r)/2];
}

/*template<class Type>
Type Cpair1(Type a[],int n){
//只是输出最小距离版本的
	Type dmin = maxint;//表示最接近点对的距离
	//a为一位数组,表示x轴上的点,n为点的数目
	if(n < 2)
	{
		d = maxint;
		return d;
	}

	Type d1 = Cpair1(a,(n+1)/2);//递归求解
	Type d2 = Cpair1(&a[(n+1)/2],n/2);//递归求解

	Type p = a[(n+1)/2 - 1];//左侧最大的点
	Type q = a[(n+1)/2];//右侧最小的点
	d = min(d1,d2,q-p);
	return d;


}
*/

template<class Type>
Type Cpair1(Type a[],int n,Type &pleft,Type &qright){
	Type d = maxint;//表示最终最接近点对的距离
	//a为一位数组,表示x轴上的点,n为点的数目
	if(n < 2)
	{
		d = maxint;
		return d;
	}

	int d1_p,d1_q;
	int d2_p,d2_q;

	Type d1 = Cpair1(a,(n+1)/2,d1_p,d1_q);//递归求解
	Type d2 = Cpair1(&a[(n+1)/2],n/2,d2_p,d2_q);//递归求解

	Type p = a[(n+1)/2 - 1];//左侧最大的点
	Type q = a[(n+1)/2];//右侧最小的点

	if ( d1 < d2 ) {

		if( d1 < (q-p) ){
			pleft = d1_p;
			qright = d1_q;
			d = d1;
		}else{ // q-p is smallest, p ,q no changes
			pleft = p;
			qright = q;

			d = q-p;
		}
		
	}else{  // d2 >= d1

		if( d2 < (q-p) ){
			pleft = d2_p;
			qright = d2_q;
			d = d2;
		}else{ // q-p最小
			pleft = p;
			qright = q;
			d = q-p;
		}
	}
	return d;	
}


void main(){
	int a[5] = {3,6,8,10,14};
	int pleft = maxint,qright = maxint;
	RandomizedQuickSort(a,0,4);
	cout<<"x轴上点的中位点是:"<<"("<<RandomizedSelect(a,0,4)<<",0)";
	cout<<endl<<"最接近的两点的距离是:"<<Cpair1(a,5,pleft,qright)<<endl;
	cout<<endl<<"两个点为"<<"("<<pleft<<",0)"<<" , ("<<qright<<",0)"<<endl;

}


你可能感兴趣的:(c)