2011-09-15 10 views
0

このバブルソートを書き、ユーザーが入力した量だけ乱数をリストに与えるテストプログラムで使用しました。その後、10,000個のランダムなintのリストが与えられ、55行目のスタックオーバーフローが返されました。if(swaps!= 0){sort();}また時には動作しますが、負のmyComparesとmySwapsの値を戻します。手伝ってくれますか?ソートスタックオーバーフローと比較数とスワップ数負数

public class Bubbly { 

    private int[] sortedList; 
    private static long myTime = 0; 
    private static int myCompares = 0; 
    private static int mySwaps = 0; 

    public Bubbly(int[] list) { 
     sortedList = list; 
     StopWatch stop = new StopWatch(); 
     stop.start(); 
     sort(); 
     stop.stop(); 
     myTime = stop.getElapsedTime(); 
    } 

    public int[] getList(){ 
     return sortedList; 
    } 
    public long getTime(){ 
     return myTime; 
    } 

    public int getCompares(){ 
     return myCompares; 
    } 

    public int getSwaps(){ 
     return mySwaps; 
    } 

    public void sort(){ 
     int length = sortedList.length, i = 0, num, swaps = 0; 

     while (i < length - 1){ 
      if (sortedList[i] > sortedList[i + 1]) { 
       myCompares++; 

       num = sortedList[i]; 
       sortedList[i] = sortedList[i+1]; 
       sortedList[i+1] = num; 
       swaps++; 
       mySwaps++; 
      } 
      myCompares++; 
      i++; 
     } 

     if (swaps != 0){ 
      sort(); 
     } 

    } 
} 

答えて

2

あなたのプログラムは、おそらく私が今まで

再帰:-)見てきた最初の再帰的なバブルソートではなく、各時間ソート(、作業が完了するまで、関数が戻らないことを意味し、再帰的です)余分なコールがスタックにプッシュされると呼ばれます。そして、いくつかの再帰呼び出しの後で、スタックは一杯でオーバーフローします。

ここでは、ループを使用するだけで再帰を取り除くことはできません。

負の値を持つ変数に関しては、mySwaps、myTime、およびmyCompareのstatic修飾子を取り除くことから始めます。これは、各テスト実行時に正しい初期化ができないためです。