2016-06-18 3 views
-3

я решал эту проблему с вундеркиндов для гиков http://www.geeksforgeeks.org/median-of-two-sorted-arrays-of-different-sizes/ но когда я реализован тот же самый код, то для ввода А [] = {1,2,3} В [] = { 3,6,9,12} он дает неправильный результат как 6, но он должен быть 3, кто-то, пожалуйста, сообщите мне о проблеме с моим кодом?медиана двух отсортированных массивов разного размера

//code 

#include<iostream> 
#include<cmath> 

using namespace std; 


float single_median(int arr[],int size)//method to find median in an arr 

{ 
    if(size == 0) 
    return -1; 

    else if(size%2==0) 
    return (arr[size/2] + arr[size/2 -1])/2.0; 

    else 
    return arr[size/2]; 
} 

float medianOf2(int a,int b)//median of two numbers 
{ 
    return ((a+b)/2.0); 
} 

int medianOf3(int a,int b,int c)//median of 3 numbers 
{ 
    int maximum = max(a,max(b,c)); 
    int minimum = min(a,min(b,c)); 
    return ((a+b+c) - maximum - minimum); 
} 

int medianOf4(int a, int b,int c,int d)//median of 4 numbers 
{ 
    int maximum = max(a,max(b,max(c,d))); 
    int minimum = min(a,min(b,min(c,d))); 
    return ((a+b+c+d) - maximum - minimum); 
} 

int find_median(int A[],int m,int B[],int n) 
{ 
    if(m<n)//here we will keep in mind that A is larger than B else we swap 
    return find_median(B,n,A,m); 

    if(n==0)//if smaller array has no element just find the median of larger array 
    return single_median(A,m); 

    if(n==1)//if smaller array has one element 
    { 
     if(m==1) 
     return (A[0]+B[0])/2.0;//if both has one element just return the average 

     else if(m&1)//when larger array has odd elements 
     return medianOf2(medianOf3(B[0],A[m/2 - 1],A[m/2 + 1]),A[m/2]); 

     else//for e 
     return medianOf3(B[0],A[m/2],A[m/2 -1]); 

    } 

    if(n==2) 
    { 
     if(m==2) 
     return medianOf4(A[0],B[0],A[1],B[1]); 

     else if(m&1) 
     return medianOf3(max(B[0],A[m/2 -1]),min(B[1],A[m/2 +1]),A[m/2]); 

     else 
     return medianOf4(max(B[0],A[m/2 -2]),min(B[1],A[m/2 +1]),A[m/2],A[m/2 -1]); 

    } 

    int mid_m = (m-1)/2; 
    int mid_n = (n-1)/2; 

    if(A[mid_m]<B[mid_n]) 
     find_median(A + mid_m,m/2 +1 ,B,n - mid_n); 
    else 
     find_median(A,n/2 +1, B + mid_n, n/2 + 1); 


} 

int main() 
{ 
    int B[] = {1,2,3}; 
    int A[] = {3,6,9,12}; 

    cout<<find_median(A,4,B,3); 
    return 0; 
} 
+0

Вопросы, подобные «скажите мне проблему с моим кодом», здесь запрещены, см. Http://stackoverflow.com/help/on-topic. – Alex

+0

ok sir Я не буду повторять это, спасибо за информирование. – skvatss

+0

'return ((a + b + c + d) - максимум - минимум);' <- эта строка не разделяется на '2.0', что имеет смысл, так как вы получаете 6, но должны быть 3. fix это строка для этого: 'return ((a + b + c + d) - maximum - minimum)/2.0;' – davedwards

ответ

1

Вы просто забыли разделить результат на 2,0 в функции medianOf4 перед возвратом результата, так:

int medianOf4(int a, int b,int c,int d)//median of 4 numbers 
{ 
    int maximum = max(a,max(b,max(c,d))); 
    int minimum = min(a,min(b,min(c,d))); 
    return ((a+b+c+d) - maximum - minimum)/2.0; # <-- forgot to add "/ 2.0" 
} 

Надеется, что это помогает!

+0

@skvatss Если вы считаете, что этот ответ помог решить вашу проблему, отметьте его как «принятый», щелкнув зеленый галочка. Это поможет сообществу сосредоточиться на неотвеченных вопросах. – Lahiru

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