使用递归查找n个数字数组中的最大和最小元素

时间:2016-03-18 12:01:17

标签: c arrays algorithm recursion divide-and-conquer

我正在使用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

1 个答案:

答案 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);

阅读有关按值调用

的内容