2011-05-21 79 views
2

沒有人有任何想法,爲什麼我會在下面的代碼來讓我的快速排序堆棧溢出?:堆棧溢出的Java快速排序的陣列

private int[] concat(int[] less, int inxl, int pivot, int inxm, int[] more) 
    { 

     int[] concated = new int[ less.length ]; 

     for(int inx = 0; inx < inxl; inx++) 
     { 

     concated[ inx ] = less[ inx ]; 

     } 

     concated[ inxl ] = pivot; 
     inxl++; 

     for(int inx = 0; inx < inxm; inx++) 
     { 

     concated[ inxl ] = more[ inx ]; 
     inxl++; 

     }  

     return concated; 

    } 

    private int[] quickSort(int[] array) 
    { 

     if(array.length <= 1) 
     return array; 

     int[] less = new int[ array.length ]; 
     int[] more = new int[ array.length ]; 
     int inxl = 0, inxm = 0; 

     for(int inx = 1; inx < array.length; inx++) 
     { 

     if(array[ inx ] < array[ 0 ]) 
     { 

      less[ inxl ] = array[ inx ]; 
      inxl++; 

     } 
     else 
     { 

      more[ inxm ] = array[ inx ]; 
      inxm++; 

     } 

     } 

     return concat(quickSort(less), inxl, array[ 0 ], inxm, quickSort(more)); 

    } 

任何幫助將不勝感激。我正在修改採訪,並且有點生疏,所以時間非常重要。非常感謝! :)

此致, Piotr。

回答

6

您的quickSort方法的遞歸是錯誤的。它應該使用更小的數組(或者其他一些參數變小)自己調用,而不是使用相同長度的數組。這就是爲什麼你會得到無盡的遞歸,這顯示爲StackOverflowError

+0

gotcha!當然......謝謝*感覺愚蠢的* :) – Piotr 2011-05-21 18:50:13

+0

我應該使用ArrayList!調整越來越少的陣列是尷尬和膨脹的......除非你有什麼建議? – Piotr 2011-05-21 18:52:22

+1

您可以使用遞歸函數的附加參數來說明要處理哪個數組的間隔。 (然後你的臨時陣列下一次通話只需要最大限度地擴大這個尺寸。) – 2011-05-21 18:56:16

0

我不知道你是否永遠遞歸。你在哪裏縮小你的quicksort方法中的數組大小?你有沒有使用數組大小​​的println來登場,看它是否變小了?

+0

我似乎有點慢...看起來好像是1+對Paulo來說我擊敗了我! :) – 2011-05-21 18:50:11