我正在使用Divide和conquer技术,在每次迭代时将数组减少一半。我是代码逻辑的结构。
#include <stdio.h>
void minmax(int a[], int min,int max, int l,int r)
{
int m,min1,max1;
if(l==r)
{
min=a[l];
max=a[l];
}
else if((r-l)==1)
{
if(a[l]<=a[r])
{
min=a[l];
max=a[r];
}
else
{
min=a[r];
max=a[l];
}
}
else
{
m = (l+r)/2;
minmax(a,min,max,l,m);
minmax(a,min1,max1,m+1,r);
if(max1>max)
max=max1;
if(min1<min)
min=min1;
}
printf("%d \t %d\n",max,min);
}
int main(void)
{
int a[]={12,4,32,76,34,77,24,12};
minmax(a,a[0],a[0],0,7);
return 0;
}
输出结果如下
12 4
76 32
12 0
77 34
24 12
0 0
12 0
期望输出
12 4
76 32
76 4
77 34
24 12
77 12
77 4
有什么建议吗?感谢。
编辑1:算法
Algorithm MinMax(A[l..r], minval, maxval)
//Finds the values of the smallest and largest elements in a given subarray
//Input: A portion of array A[0..n − 1] between indices l and r (l ≤ r)
//Output: The values of the smallest and largest elements in A[l..r]
//assigned to minval and maxval, respectively
if r = l
minval ← A[l]; maxval ← A[l]
else if r − l = 1
if A[l] ≤ A[r]
minval ← A[l]; maxval ← A[r]
else
minval ← A[r]; maxval ← A[l]
else //r − l > 1
MinMax(A[l..(l + r)/2], minval, maxval)
MinMax(A[(l + r)/2 + 1..r], minval2, maxval2)
if minval2 < minval
minval ← minval2
if maxval2 > maxval
maxval ← maxval2
答案 0 :(得分:2)
你需要使用指针使minmax()返回任何东西......
尝试使用
void minmax(int a[], int * min_ptr,int * max_ptr, int l,int r){
int m,min,max,min1,max1;
退出前:
*min_ptr=min;
*max_ptr=max;
return;
}
并替换
中的所有minmax来电minmax(a,min,max,l,m);
到
minmax(a,&min,&max,l,m);
阅读有关按值调用
的内容