/*
1.设计程序利用分治策略求n个数的最大值和最小值。
*/voidmaxmin2(int A[],int i,int j,int*max,int*min)//分治{/*A存放输入的数据,i,j存放数据的范围,初值为0,n-1,*max,int *min 存放最大和最小值*/int mid,max1,max2,min1,min2;if(j==i){*max=*min=A[i];// 最大和最小值为同一个数;return;}if(j-1==i){*max=A[j]>A[i]?A[j]:A[i];// 将两个数直接比较,求得最大值、最小值;*min=A[j]<A[i]?A[j]:A[i];return;}
mid=(i+j)/2;maxmin2(A,i,mid,&max1,&min1);//求i~mid之间的最大最小值分别为max1,min1;maxmin2(A,mid+1,j,&max2,&min2 );//求mid+1~j之间的最大最小值分别为max2,min2;*max=max1>max2?max1:max2;// 比较max1和max2,大的就是最大值;*min=min1<min2?min1:min2;// 比较min1和min2,小的就是最小值;}voidmain(){maxmin2(A,0,n-1,&max,&min);printf("the max number is : %d\n",max);//输出结果printf("the min number is : %d\n",min);}/*
2.利用分治策略,在n个不同元素中找出第k个最小元素。
*/voidfind(int A[],int k,int n,int*min)//利用分治策略,在n个不同元素中找出第k个最小元素{
m=A[k];//取第k个元素作为标准m
j=n/2;
B[j]=m;for(x=1;x<=n;x++)//把n个元素重新排列{if(A[x]<m)//小于标准m的元素区间1~j{for(y=1;y<j;y++){
B[y]=A[x];}}else//大于标准m的元素区间j+1~n{for(y=j+1;y<=n;y++){
B[y]=A[x];}}}if(j==k)//1)j=k,则找到第k个元素。{*min=m;return;}if(j<k)//2)j<k,则第k个元素在区间j+1~n。{find(B,k,j+1,n,&min);//在情况2继续寻找。}else//3)j>k,则第k个元素在区间1~j。{find(B,k,1,j,&min);//在情况3继续寻找。}}voidmain(){find(A,k,n,&min);//利用分治策略开始查找printf("the NO.%d min number is : %d\n",k,min);//输出结果值}