2012-03-03 6 views
-3

私はこのアルゴリズムを本から直接コピーしていますが、 "ERROR HERE !!!!"にArrayIndexOutOfBoundsExceptionが続きます。 T [i] = ...のための部分... ...メディアンのメジアンを修正する方法私はアルゴリズムから自己翻訳しました

これは私をナットにしているし、これを行う必要があります...誰かが私はこれを修正する方法を提案することができますか?私はまた、本からアルゴリズムを翻訳することによる他の潜在的なエラーをコメントしました...

見出しはしばらく前に戻ってください。ヘルプは非常に非常に高く評価されるだろう。..

public static int select(int n, int S[], int k) 
    { 
     return select4(S, 1, n, k); 
    } 

    public static int select4(int S[], int low, int high, int k) 
    { 
     int pivotpoint = (low+high)/2; //the algorithm didn't define "pivotpoint", so I'm assuming I can use anything.. 
     if(high==low) 
      return (S[low]); 
     else { 
      partition4(S, low, high, pivotpoint); 
      if(k==pivotpoint) 
       return(S[pivotpoint]); 
      else if(k<pivotpoint) 
       return(select4(S, low, pivotpoint-1, k)); 
      else 
       return(select4(S, pivotpoint+1, high, k)); 
     } 
    } 

    public static void partition4(int S[], int low, int high, int pivotpoint) 
    { 
     int arraysize = high - low + 1; 
     int r = (int)Math.ceil(arraysize/5); //maybe error because not double? 
     int i, j, mark=0, first, last; 
     int pivotitem; 
     int[] T = new int[r]; 
     int temp; 

     for(i=1; i<=r; i++) { 
      first = low + 5*i - 5; 
      last = Math.min(low + 5*i - 1, arraysize); 
      T[i] = S[(first+last)/2]; //Algorithm says "median of S[first] through S[last]" 
//  ^ERROR HERE!!!!!!!!!!!! 
     } 

     pivotitem = select(r, T, (int)Math.floor((r+1)/2)); //maybe error because not double? 
     j = low; 

     for(i=low; i<=high; i++) { 
      if(S[i] == pivotitem) { 
       temp = S[i]; 
       S[i] = S[j]; 
       S[j] = temp; 
       mark = j; 
       j++; 
      } 
      else if(S[i] < pivotitem) { 
       temp = S[i]; 
       S[i] = S[j]; 
       S[j] = temp; 
       j++; 
      } 
     } 
     pivotpoint = j-1; 
     temp = S[mark]; 
     S[mark] = S[pivotpoint]; 
     S[pivotpoint] = temp; 
    } 
+1

ステップスルーあなた自身でこれをデバッグしていますか? –

+1

私は 'ERROR HERE !!!!'を見つけることができません。セクション!デバッガを使ってみましたか? – home

+2

デバッガーは素晴らしいツールです。それを使うことを学ぶことは非常に貴重です。 –

答えて

1

あなたは0..r-1としてTを割り当てる:

int[] T = new int[r]; 

その後、あなたは何の努力1..r

for(i=1; i<=r; i++) 
T[i] = 
+0

ああ、ブライアンがヒントしようとしていたことです今のところチェックしてください – user1189352

+0

それはfor(i = 0; i user1189352

+0

私はそれをi = 0に変更しました。それは負の値の最初と最後の値を乱しています。 – user1189352

関連する問題