2014-01-26 4 views
0

파이썬에서 병합 정렬 알고리즘을 작성했습니다. 그것은 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

세그먼트 오류? 파이썬에서? 도대체 뭘 한거야? 코드를 보여주세요. – user2357112

+0

내 코드 @ user2357112를 추가했습니다. –

답변

3

스택 오버플로가있는 것 같습니다. merge은 병합 할 목록 크기의 순서로 스택 공간을 사용합니다. 이는 파이썬이 처리 할 수있는 것보다 더 많은 방법입니다. 보통, 파이썬은 그 점에 도달하기 전에 RuntimeError으로 당신을 멈출 것입니다; 안전 한도를 지키려면 sys.setrecursionlimit을 사용했을 것입니다. setrecursionlimit을 사용을 중지하고 재귀를 사용하지 않으려면 merge을 다시 작성하십시오.

+0

예 sys.setrecursionlimit을 사용했습니다. 재귀 병합 기능을 변경하는 것 외에 다른 방법이 있습니까? –

+0

@ GüngörBasa : 스택없는 Python 구현으로 전환하거나 OS가 할당하는 스택 공간의 양을 변경할 수는 있지만 'merge'에서 재귀를 사용하지 않는 것이 가장 좋은 옵션입니다. – user2357112

+0

제안 해 주셔서 감사합니다. @ user2357112 –