2016-03-18 5 views
0

Я использую технику Divide и Conquer, которая уменьшает массив до половины на каждой итерации. Я структурирован с логикой кода.Чтобы найти самые большие и наименьшие элементы в массиве из n чисел, используя рекурсию

#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 

Есть предложения? Благодарю.

EDIT 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 
+4

Debugging звучит как разумный план. –

ответ

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

и читать что-то о вызов по значению

+0

По-прежнему существует проблема с указателями. Ошибка выполнения. Я включил алгоритм в последнее редактирование вопроса. –

+0

Алгоритм в порядке, вам нужно узнать о указателях. http://ideone.com/MJdlkk – xvan

+0

Да, я буду .. Спасибо за решение! У меня есть вопрос. Зачем возвращаться, когда тип возврата недействителен? Можете ли вы рассказать об этом? –

 Смежные вопросы

  • Нет связанных вопросов^_^