#include <stdio.h>
void main()
{
void partF(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2);
int num;
scanf("%d",&num);
int a[num];
for(int i=0;i<num;i++)
scanf("%d",&a[i]);
/********** Begin **********/
int max1,max2,min1,min2;
partF(a ,0 , num-1 ,&max1 ,&max2 ,&min1 ,&min2);
printf("max1=%d max2=%d\nmin1=%d min2=%d\n",max1,max2,min1,min2);
/********** End **********/
}
void partF(int* a, int m, int n, int *max1, int *max2, int *min1, int *min2){
int lmin1, lmin2, lmax1, lmax2;
int rmin1, rmin2, rmax1, rmax2;
int mid;
//一,最低层的结尾
if(m == n){
*min1 = *min2 = *max1 = *max2 = a[m];
}
//二,进行最低层的比较
else if(m == n-1){
if(a[m]<a[n])
{
*min1=a[m];
*min2=a[n];
*max1=a[n];
*max2=a[m];
}
else
{
*min1=a[n];
*min2=a[m];
*max1=a[m];
*max2=a[n];
}
}
//递归部分
else{
mid = (m+n)/2;
//借助 l 和 r 的便利把数组递归式分成两部分,直到分化成一。然后开始返还
partF(a, m, mid, &lmax1, &lmax2, &lmin1, &lmin2);
partF(a, mid+1, n, &rmax1, &rmax2, &rmin1, &rmin2);
//比大小
//max比较
if(lmax1 < rmax1){
if(lmax1 < rmax2){
*max1 = rmax1;
*max2 = rmax2;
}
else{
*max1 = rmax1;
*max2 = lmax1;
}
}
else{
if(lmax2 > rmax1){
*max1 = lmax1;
*max2 = lmax2;
}
else{
*max1 = lmax1;
*max2 = rmax2;
}
}
//min比较
if(lmin1 > rmin1){
if(lmin1 > rmin2){
*min1 = rmin1;
*min2 = rmin2;
}
else{
*min1 = rmin1;
*min2 = lmin1;
}
}
else{
if(lmin2 > rmin1){
*min1 = lmin1;
*min2 = rmin1;
}
else{
*min1 = lmin1;
*min2 = lmin2;
}
}
}
}
C语言分治法——求一组数据中最大的两个数和最小的两个数。
最新推荐文章于 2024-04-16 16:28:32 发布