【问题标题】:To find largest and smallest elements in an array of n numbers using recursion [closed]使用递归在 n 个数字的数组中查找最大和最小元素
【发布时间】:2016-07-05 04:11:45
【问题描述】:

我正在使用分而治之的技术,在每次迭代时将数组减半。我对代码的逻辑是结构性的。

#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

【问题讨论】:

  • 调试听起来是个合理的计划。

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


【解决方案1】:

你需要使用指针来让 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);

阅读一些关于按值调用

【讨论】:

  • 指针还是有问题。运行时错误。我已将算法包含在最近的问题编辑中。
  • 算法很好,需要学习指针。 ideone.com/MJdlkk
  • 是的,我会的。感谢您的解决方案!我有个问题。返回类型为void时为什么要返回?你能解释一下吗?
  • void 表示未使用退货。因此,如果有人尝试 x=minmax(...) 编译器会引发错误。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2019-02-24
  • 1970-01-01
  • 2016-11-26
  • 2016-03-27
相关资源
最近更新 更多