2016-07-02 13 views
-4

これは2つのソートされた配列の中央値を見つけるためのプログラムです。整数に配列変数を追加できますか?

同じサイズの2つのソートされた配列の中央値を見つけるために、分割して征服する効率的な解決法。

#include<bits/stdc++.h> 
    using namespace std; 

    int median(int [], int); /* to get median of a sorted array */ 

    /* This function returns median of ar1[] and ar2[]. 
    Assumptions in this function: 
    Both ar1[] and ar2[] are sorted arrays 
    Both have n elements */ 
    int getMedian(int ar1[], int ar2[], int n) 
    { 
     /* return -1 for invalid input */ 
     if (n <= 0) 
      return -1; 
     if (n == 1) 
      return (ar1[0] + ar2[0])/2; 
     if (n == 2) 
      return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1]))/2; 

     int m1 = median(ar1, n); /* get the median of the first array */ 
     int m2 = median(ar2, n); /* get the median of the second array */ 

     /* If medians are equal then return either m1 or m2 */ 
     if (m1 == m2) 
      return m1; 

     /* if m1 < m2 then median must exist in ar1[m1....] and 
      ar2[....m2] */ 
     if (m1 < m2) 
     { 
      if (n % 2 == 0) 
      { 

       return getMedian(ar1 + n/2 - 1, ar2, n - n/2 +1); 

      } 
      return getMedian(ar1 + n/2, ar2, n - n/2); 
     } 

     /* if m1 > m2 then median must exist in ar1[....m1] and 
      ar2[m2...] */ 
     if (n % 2 == 0) 
      return getMedian(ar2 + n/2 - 1, ar1, n - n/2 + 1); 
     return getMedian(ar2 + n/2, ar1, n - n/2); 
    } 

    /* Function to get median of a sorted array */ 
    int median(int arr[], int n) 
    { 
     if (n%2 == 0) 
      return (arr[n/2] + arr[n/2-1])/2; 
     else 
      return arr[n/2]; 
    } 

    /* Driver program to test above function */ 
    int main() 
    { 
     int ar1[] = {1, 2, 3, 6}; 
     int ar2[] = {4, 6, 8, 10}; 
     int n1 = sizeof(ar1)/sizeof(ar1[0]); 
     int n2 = sizeof(ar2)/sizeof(ar2[0]); 
     if (n1 == n2) 
      printf("Median is %d", getMedian(ar1, ar2, n1)); 
     else 
      printf("Doesn't work for arrays of unequal size"); 
     return 0; 
    } 

私の質問は、配列変数を整数に追加する方法です。私はここでgetmedian関数呼び出しでこれを(ar1 + n/2 - 1)するとメモリを参照しているかどうかを意味しますか?

+1

あなたが尋ねていることは少し不明です.... –

+0

これはC言語の_pointers arithmetic_です。 CやC++に関する初心者の本であれば、その情報を見つけることができます。 – ilotXXI

答えて

0

式では、配列指定子は暗黙的に最初の要素へのポインタに変換されます。整数にポインタを追加すると、ポインタが再び得られます。それはいわゆるポインタ演算です。もしアレイ

int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
const size_t N = sizeof(a)/sizeof(*a); 

を有する場合

したがって、例えば、次に発現

a + N/2 

は、配列の6番目の要素を指します。ここで

が実証プログラムが

#include <stdio.h> 

int main(void) 
{ 
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    const size_t N = sizeof(a)/sizeof(*a); 

    for (size_t i = 0; i < N; i++) printf("%p: %d\n", a + i, *(a + i)); 

    return 0; 
} 

でその出力は、配列はまた、ポインタに調整されているようにも関数パラメータが宣言

0xbfd3d9c8: 0 
0xbfd3d9cc: 1 
0xbfd3d9d0: 2 
0xbfd3d9d4: 3 
0xbfd3d9d8: 4 
0xbfd3d9dc: 5 
0xbfd3d9e0: 6 
0xbfd3d9e4: 7 
0xbfd3d9e8: 8 
0xbfd3d9ec: 9 

のように見えるかもしれません。たとえば、これらの関数の宣言は、同等のものであり、同じ関数を宣言します。

+0

ありがとうVald私は答えを得た。 –

関連する問題