2011-09-15 64 views
0

我寫了這個冒泡排序,並將其用於測試程序,該程序通過用戶輸入的數量給出列表中的隨機數。然後給它一個10,000個隨機整數的列表,並返回55行的堆棧溢出「if(swap!= 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上的靜態修飾符,因爲它會在每次測試運行時禁止它們的正確初始化。