2012-04-15 12 views
2

を投げ、私はクイックソートアルゴリズムの実装を作成し、いくつかのランダムな順序で100kの番号のリストをソートするためにこれを使用する必要があります。クイックソートアルゴリズムは、宿題のためにStackOverflowExceptionが

は、割り当ての最初の部分で、Iは、ピボット要素として配列の最初の項目を使用しなければなりません。これはソートされたリストを返します。ただし、割り当ての2番目の部分では、最後の項目をピボットとして使用する必要があり、結果としてStackOverflowExceptionが発生します。 8レコードの小さなコレクションで試してみると、正常に動作します。私は自分のコードを見てきましたが、私はどこで間違いをしているのか分かりません。どんな助けでも大歓迎です。私のコードは次の通りです:

public class QuickSort { 

    private QuickSortStrategyEnum quickSortStrategy; 

    public QuickSort(QuickSortStrategyEnum quickSortStrategy) { 

     this.quickSortStrategy = quickSortStrategy; 
    } 

    public List<Integer> sortIntegerArray(List<Integer> arrayList, int left, int right) { 

     if (left >= right) { 
      return arrayList; 
     } 

     int i = partition(arrayList, left, right); 

     if (i <= right) { 

      int pivotNew = partition(arrayList, i, right); 
      int pivotIndex = arrayList.indexOf(pivotNew); 

      arrayList = sortIntegerArray(arrayList, left , pivotIndex - 1); 
      arrayList = sortIntegerArray(arrayList, pivotIndex + 1, right); 
     } 

     return arrayList; 
    } 

    private int partition(List<Integer> arrayList, int left, int right) { 

     int pivot = getPivot(arrayList, left, right); 
     int i = left + 1; 

     for (int j = i; j <= right; j++) { 

      if (arrayList.get(j) < pivot) { 

       Collections.swap(arrayList, j, i); 
       i++; 
      } 
     } 

     Collections.swap(arrayList, left, i - 1); 
     return i; 
    } 

    private int getPivot(List<Integer> arrayList, int left, int right) { 

     int pivot = 0; 

     switch (quickSortStrategy) { 

      case FIRST: 
      pivot = arrayList.get(left); 
      break; 

      case LAST: 
      pivot = arrayList.get(right); 
      break; 
     } 
     return pivot; 
    } 

} 
+0

例外をどのメソッド/行がスローするかを知るのに役立ちます。 –

答えて

1

David Harkness氏によれば、パーティションロジックには問題があります。これを試してみてください:(デイヴィッド・ハークネスが指すものを取り除いた後)

private int partition(List<Integer> arrayList, int left, int right) { 

    int pivot = getPivot(arrayList, left, right); 
    int i = left - 1; 

    for (int j = left; j < right; j++) { 
     if (arrayList.get(j) <= pivot) { 
      i++; 
      Collections.swap(arrayList, j, i); 
     } 
    } 

    Collections.swap(arrayList, i+1, right); 
    return i+1; 
} 

ピボットが最後の要素であるとき、それはケースのために動作します。最初の要素ではありません。

読むには、Eclipseに挨拶、その後、紙、ドライラン物事うちに作業を理解する擬似コードを記述します。物事を急いではいけません。

+0

左に最初の要素(0)がある場合は、 'Collections.swap(arrayList、j、i) ; '' IndexOutOfBoundsException'をスローします。 Sanderのコードでは、行は 'int i = left + 1;'です。コピーペーストエラーですか? –

+0

Aaahあなたは正しいです:)私は実際にプロセスを理解する前に、あまりに早くソリューションをプログラムしようとしました。今私はそれがどのように動作し、この解決策を続けることができるのか理解しています。私は十分なポイントを持っていないので残念ながらあなたをアップアップすることはできませんが、ありがとう! – Sander

+0

@JessevanAssen Collections.swap(arrayList、j、i)を呼び出す前に、私はiをインクリメントします。私は自分のコードをテストし、それが動作します –

5

ヒント:right == left + 1の場合はどうなりますか?何partitionリターンで

int pivotNew = partition(arrayList, i, right); 
int pivotIndex = arrayList.indexOf(pivotNew); 

ルックを、あなたはその結果を使用してどのようにそれを比較:

+0

+1デバッガでコードをステップ実行すると便利です。 ;) –

+0

'partition'以外にも多忙な仕事をしていて、私はこの状態に問題は見られません。私は頭の中でそれだけで踏み込んでいます。 :) –

1

この2行は、魚に見えます。

+0

ええ、あなたはここにいます、今これを修正しました。 :)残念ながら私はまだあなたにアップアップをするのに十分なポイントを持っていません。 – Sander