2014-01-26 69 views
0

我在python中編寫了合併排序算法。它完美的工作,直到10000數字,但10000後,它給我分段錯誤11.可能是什麼問題?任何想法關於它合併排序算法失敗

def merge_count(arr): 
    if len(arr) < 2: 
     return (arr, 0) 
    m = int(len(arr)/2) 
    left, l_counter = merge_count(arr[:m]) 
    right, r_counter = merge_count(arr[m:]) 
    return merge(left, right, l_counter + r_counter) 


def merge(left, right, counter): 
    if len(left) * len(right) == 0: 
     return (left + right, counter) 
    if left[len(left) - 1] > right[len(right) - 1]: 
     val = left.pop(len(left) - 1) 
     counter += len(right) 
    else: 
     val = right.pop(len(right) - 1) 
    arr, counter = merge(left, right, counter) 

    return (arr + [val], counter) 
+0

代碼在哪裏? – RaviH

+1

分割錯誤?在Python中?你究竟做了什麼?向我們展示代碼。 – user2357112

+0

我加了我的代碼@ user2357112 –

回答

3

它看起來像你有一個堆棧溢出。 merge按照列表大小的順序使用堆棧空間進行合併,這是Python可以處理的方式。通常情況下,在你達到那個點之前,Python會阻止你使用RuntimeError;您可能使用sys.setrecursionlimit超過安全限制。停止使用setrecursionlimit,並重寫merge以不使用遞歸。

+0

是的,我使用了sys.setrecursionlimit。除了更改遞歸合併函數外,還有其他方法嗎? –

+0

@GüngörBasa:您可以切換到無堆棧的Python實現或更改OS分配的堆棧空間量,但在merge中不使用遞歸最有可能是最佳選擇。 – user2357112

+0

感謝您的建議。 @ user2357112 –