2017-10-27 7 views
0

私はArrayListのをソートするクイックソートアルゴリズムを使用していますし、これはQuickSort.javaで私のコードです:Java - 1回の実行で例外がスローされ、別の実行で例外が発生するのはなぜですか?

public class QuickSort { 

public ArrayList<Integer> quickSort(ArrayList<Integer> data , int low , int high){ 

    ArrayList<Integer> sortedData = new ArrayList<Integer>(); 

    if(low< high) { 
     int pivotIndex = low; // Assume first element is the pivot 
     int pivot = data.get(low);// The pivot value 
     data.set(pivotIndex, data.get(high));// Swap pivot with last item 
     data.set(high, pivot); 
     int i = low - 1; 
     int j = high; 

     do {     
      do {i++;} while (data.get(i)< pivot); 

      do {j--;} while (data.get(j)> pivot); //line 35 
      if (i < j) { 
       int temp = data.get(i); 
       data.set(i, data.get(j)); 
       data.set(j, temp); 

      } 

     } while (i < j); 

     data.set(high, data.get(i)); // Put the pivot back in the middle 
     data.set(i, pivot); 

     quickSort(data, low, i - 1);// Recursive sort left list 
     quickSort(data, i + 1 ,high);// Recursive sort right list 
    } 

    sortedData = data; 

    return sortedData ; 
} 
} 

とメインクラスで:

// sort random data with quick sort 

    QuickSort q = new QuickSort(); 

    ArrayList<Integer> quickSortedD = new ArrayList<Integer>(); 

    System.out.println("randomD before q s "+ randomD); 
    int low = 0; 
    int high = randomD.size() -1 ; 

    System.out.println("high : " + high); 

    quickSortedD = q.quickSort(randomD ,low, high); // low is the first element and high is the last element in the arraylist 

    System.out.println("quickSortedD" + quickSortedD); 

randomDはランダムに生成されていますArrayListのですそれぞれのランで、固定サイズ1500である。

問題は次のとおりです。ファイルを実行すると例外がスローされ、時には正常に構築されることがあります。

スローされた例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at java.util.ArrayList.elementData(ArrayList.java:422) 
at java.util.ArrayList.get(ArrayList.java:435) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:35) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.QuickSort.quickSort(QuickSort.java:48) 
at sortingtechniques.SortingTechniques.main(SortingTechniques.java:104) 

/home/gfdg/.cache/netbeans/8.2/executor-snippets/run.xml:53:Javaが返さ:1 BUILD FAILED(合計時間:0秒)

QuickSort.java:35:

do {j--;} while (data.get(j)> pivot); 

QuickSort.java:48:

quickSort(data, low, i - 1);// Recursive sort left list 

SortingTechniques.java:104:

quickSortedD = q.quickSort(randomD ,low, high); 

このエラーが発生する理由とどのように私はそれを修正できますか?

+1

デバッガを使用します。何が起こるか見る。あなたがそれを確認していないので、簡単に否定に行くことができます。それは問題を引き起こすでしょう。 –

+0

それは^^^のように見えます: "ArrayIndexOutOfBoundsException:-1" – Jeutnarg

+0

http://www.vogella.com/tutorials/JavaAlgorithmsQuicksort/article.html –

答えて

0

理由は、私は上の制限を入れていないということです{J - ;}

ので、それが時にはそれが、今それがために変更した後に動作することをデクリメント-1

続ける:

do {j--;} while (j>=0 && data.get(j)> pivot); 
関連する問題