2014-03-19 139 views
0

所以我有以下代碼在Ruby中進行合併排序。系統堆棧錯誤

class MergeSort 

    def sort(array) 
       if array.length == 1 || array.length == 0 
        return array 
       end 
       firstHalf = array[0..array.length/2] 
       secondHalf = array[(array.length/2) + 1..array.length] 
       firstHalf = sort(firstHalf) 
       secondHalf = sort(secondHalf) 
       b = 0 
       c = 0 
       for i in (0..(firstHalf.length - 1)) 
        while b < secondHalf.length && firstHalf[i] >= secondHalf[b] 
         array[c] = secondHalf[b] 
         b = b + 1 
         c = c + 1 
        array[c] = firstHalf[i] 
        c = c + 1 
       end 
       return array 
    end 

end 

array = [1,4,9,14,20,25] 
puts MergeSort::new.sort(array) 

當我運行代碼時,我得到一個SystemStackError。有人能告訴我爲什麼會發生這種情況嗎?謝謝。

+0

它不引發SystemStackError。它引發了語法錯誤。 – sawa

回答

0

爲了打電話.new你必須在你的班級有一個initialize方法。 什麼你可能想要做的類本身調用.sort,在這種情況下,你有self前綴,所以:

class MergeSort 
    def self.sort(array) 
    ... 

之後,你可以這樣調用:

MergeSort.sort(array) 
1

在猜測,一旦該陣列的長度到達3(即元件[0..2]),呼叫

firstHalf = array[0..array.length/2] 

評估爲

0..1.5,如果1.5四捨五入至2

,然後調用排序[0..2]再次

,最終你會得到一個堆棧溢出?