用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数

来源:互联网 发布:大数据解决方案供应商 编辑:程序博客网 时间:2024/04/28 07:04

题目大意:

输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.

我大概做了两个版本,不过道理都是差不多的

1.代码如下:

 

/*4用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数。输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.*/#include<stdio.h>#include<math.h>#define N 10000int c1=0,c2=1;int min(int a,int b,int c){int m;m=a<b?a:b;return m<c?m:c;}int Cpair(int S[],int left,int right){int l,r,n;int d,d1,d2;n=right-left+1;if(n<2){d=100000;return d;}else if(n==2){d=S[right]-S[left];return d;}else{if(n%2==0){l=n/2;r=n/2-1;}else{l=(n+1)/2;r=(n-1)/2;}d1=Cpair(S,0,r);d2=Cpair(S,l,n-1);if(d2<d1){c1=left;c2=right;}d=min(d1,d2,S[l]-S[r]);if(d==S[l]-S[r]){c1=r;c2=l;}return d;}}void main(){int i,j,n,S[N],dis;printf("请输入数据个数:");scanf("%d",&n);printf("请输入数据\n");for(i=0;i<n;i++)scanf("%d",&S[i]);for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(S[j]>S[j+1]){S[j]^=S[j+1];S[j+1]^=S[j];S[j]^=S[j+1];}}}dis=Cpair(S,0,n-1);printf("最短的距离是:%d\n",dis);printf("最近的两个数是:%d %d\n",S[c1],S[c2]);}

2.。代码如下:

/*4用分治法输出一个一维数组中的n个不同实数间距离最小的两个实数。输入:实数数组X, 实数个数n, 输出: 距离最小的两个实数.*/#include<stdio.h>#include<math.h>#define N 1000#define MAXNUM 10000struct dis Cpair(int a[],int p,int q);struct dis{int d;int x;int y;};struct dis minlen;void main(){int a[]={12,25,65,46,34,19,29,91,73,59};    minlen=Cpair(a,0,9);printf("最小距离是:%d\n",minlen.d);printf("最近的两个数是:%d %d\n",minlen.x,minlen.y);}struct dis Cpair(int a[],int p,int q){int j=0,k=0,min=100000,max=0;int b[N],c[N];struct dis tom,man,cat;if(p==q){tom.x=a[p];tom.y=a[q];tom.d=MAXNUM;return tom;}if(q-p==1){tom.x=a[p];tom.y=a[q];tom.d=abs(a[q]-a[p]);return tom;}double temp=(a[p]+a[q])/2.0;for(int i=0;i<=q;i++){if(a[i]<temp){b[j]=a[i];if(b[j]>max)max=b[j];j++;}else{c[k]=a[i];if(c[k]<min)min=c[k];k++;}}man=Cpair(b,0,j-1);cat=Cpair(c,0,k-1);minlen.x=max;minlen.y=min;minlen.d=min-max;if(man.d<cat.d){tom=man;}else{tom=cat;}if(tom.d<minlen.d){minlen=tom;}return minlen;}