2017-02-07 5 views
0

병합 정렬을 구현하려고했지만 "최대 재귀 수준"오류가 계속 발생합니다. , 그것을 잡는 것이 아니라, 내가 i는 0과 1이 점에 유의, 왜최대 재귀 수준에 도달했습니다. 병합 정렬

def mergesort(listin): 
    listlen = len(listin) 

    if listlen <= 1: 
     return listin 

    left = [] 
    right = [] 
    i = 0 
    while i < listlen: 
     if i <= listlen/2: 
      left.append(listin[i]) 
     else: 
      right.append(listin[i]) 
     i += 1 

    left = mergesort(left) 
    right = mergesort(right) 


    return merge(left, right) 

def merge(listlef, listrig): 
    result = [] 

    while len(listlef) != 0 and len(listrig) != 0: 
     if listlef[0] <= listrig[0]: 
      result.append(listlef[0]) 
      listlef = listlef[1:] 
     else: 
      result.append(listrig[0]) 
      listrig = listrig[1:] 

    while len(listlef) != 0: 
     result.append(listlef[0]) 
     listlef = listlef[1:] 
    while len(listrig) != 0: 
     result.append(listrig[0]) 
     listrig = listrig[1:] 

    return result 
+0

어쩌면 관련이없는 있지만 : 어떤 모두 당신에 추가 나열하는 단지 대체하지만, 이하 2/1 == 1.

대신 인덱스 만지작 있습니다 파이썬 3을 사용하면,'listlen/2'는 float를 반환합니다. 당신은'//'을해야합니다 (모든 파이썬 버전에서 작동합니다) –

+0

입력이 충분히 길다면 최대 재귀 오류는 불가피합니다. – chepner

+0

2 개의 숫자로만 발생하는 것을 잊어 버렸습니다. – user3800750

답변

0

크기 2의 목록은 알아낼 수 없습니다 : 나의 현재의 이론은 "1 = < 경우 listlen"이다 당신이 있다면

left = [] 
right = [] 
for item in listin: 
    left.append(item) 
    left, right = right, left 
+0

주석에서 언급 된 명백한 해결책을 간과하는 대신이 기술을 지적하고 싶습니다. – chepner