2016-05-06 6 views
-1

クイックソートの実装をテスターに​​渡そうとしています。しかし、私は表彰ライン昇順のクイックソート

public void quickSort(ArrayList<String> data, int firstIndex, 
         int numberToSort) { 
    if (data.size() < 16) { 
     insertionSort(data, firstIndex, numberToSort); 
    } else { 
     int index = partition(data, firstIndex, numberToSort); 

     if (firstIndex < index - 1) 
      quickSort(data, firstIndex, index - 1); 
     if (numberToSort > index) 
      quickSort(data, index, numberToSort); 
    } 

} 

@Override 
public int partition(ArrayList<String> data, int firstIndex, 
        int numberToPartition) { 
    String pivot = data.get(firstIndex); 
    int left = data.indexOf(firstIndex); 
    int right = data.indexOf(numberToPartition); 

    while (left <= right) { 
     while (data.get(left).compareTo(pivot) < 0) // this is where I get the error       
      left++; 

     while (data.get(right).compareTo(pivot) > 0) 
      right--; 

     if (left <= right) { 
      temp = data.get(left); 
      Collections.swap(data, left, right); 
      data.set(right, temp); 

      left++; 
      right--; 
     } 
    } 
    return left; 
} 

上の-1配列のインデックスアウト境界の例外を取得私は自分のコードをデバッグしようとしたが、私は、エラーを修正する方法を見ていないようです。どんな助けもありがとう。

+1

'' 'indexOf'''は何も見つからなければ-1を返します。 –

+0

明らかに 'left'は-1 –

+0

' right == - 1'まで 'right'を減らしているので、' data.get(right) 'は' java.lang.ArrayIndexOutOfBoundsException:-1'をスローします –

答えて

1

はなぜ世界であなたは

int left = data.indexOf(firstIndex); 
int right = data.indexOf(numberToPartition); 

をやっていますか?これにより、Listの要素のうち、firstIndexnumberToPartitionの値がソートされています。これらの値は決してデータに存在することは決してありません。たとえそうであったとしても、それは完全に偶然です。データ内のそれらのインデックスは意味を持たない。これらの値の一方または両方を使用して、その後、喜んList.get()に渡すデータ、indexOf()戻り-1、でない存在がある場合には

何がしたいことはない.indexOfメソッドが返す場合firstIndex確認は、本当に、dataに発生し-1とあなたが得る作るより

int left = firstIndex; 
int right = firstIndex + numberToPartition - 1; 
0

のようなものであるように見えますjava.lang.ArrayIndexOutOfBoundsException: -1int left = data.indexOf(firstIndex);