2014-05-03 49 views
0

任何人能告訴我是什麼在我的合併排序做錯了歸併排序在Ruby中

def print_array(a) 
    print a 
    print "\n\n" 
end 

#Merge-Sort code starts Here. 
def merge_sort(a) 
    if a.size < 2 
    return a 
    end 

    middle = (a.length/2).to_i 
    left = a.slice(0, middle) 
    right = a.slice(middle, a.size) 

    merge_sort(left) 
    merge_sort(right) 

    a = merge(left, right) 
end 

def merge(left, right) 
    result = [] 

    while left.length > 0 || right.length > 0 
    if left.length > 0 && right.length > 0 
     if left[0] <= right[0] 
     result << left.slice!(0) 
     else 
     result << right.slice!(0) 
     end 
    elsif left.length > 0 
     result.concat left.slice!(0..left.length-1) 
    elsif right.length > 0 
     result.concat right.slice!(0..right.length-1) 
    end 
    end 

    result 
end 

a = [ 3, 2, 1 ] 
print_array(a) 

a = merge_sort(a) 
print_array(a) 

基本上,我所知道的是,當談到時間合併[2]和[1],即(即返回[1,2]),但是對於遞歸的前一步,當它退回時,它返回(或不回來)爲[1,2]但是作爲[2 ,1],即。

上一頁步驟 - >左= [3] - >右= [2,1]是#此的權利從遞歸的,而不是值[1,2]

我不知道如何解決這個問題,這讓我瘋狂,你能幫我嗎?

回答

2

這兩條線:

merge_sort(left) 
merge_sort(right) 

應該是:

left = merge_sort(left) 
right = merge_sort(right) 

由於您的合併排序不到位排序,您需要將結果分配回變量。

+0

哇,這很奇怪,我以爲我曾試過!但無論如何,很好的答案! – jlstr

+0

巨大的感謝之人! – jlstr