2013-08-06 5 views
0

파이썬에서 모든 정렬 알고리즘의 반복적이고 재귀적인 버전을 작성하려고합니다. 나는 아무것도 돌려주지 않는다는 사실 외에 무엇이 잘못 되었습니까? 제 슬라이싱에 문제가 있습니까? 솔루션에서재귀 삽입 파이썬에서 정렬

시도 :

def insertOne(element, aList): 
    ''' Inserts element into its proper place in a sorted list aList. 
     input: element is an item to be inserted. aList is a sorted list. 
     output: A sorted list. 
    ''' 
    if len(aList) == 0: 
     return [element] 
    elif element < aList[0]: 
     return [element] + aList 
    else: 
     return aList[0:1] + insertOne(element, aList[1:]) 





    def sort(aList): 

    if len(aList) == 0: 
     return [] 

    n = len(aList) 
    if n > 1: 
     sort(aList[:n - 1]) 
     insertOne(n, aList) 




    aList = [3,2,1] 

    print sort(aList) 
+1

가장 먼저 들여 쓰기가 잘못되었습니다. 파이썬은 들여 쓰기를 사용하여'if'와'for'와 같은 여러 줄 문장의 경계를 결정합니다; 이 코드는 줄 1에서 IndentationError와 함께 실패합니다. – user2357112

+0

두 번째 문제점은 내부 작업과 새 목록을 반환하는 작업이 혼합되어 있다는 것입니다. 'aList [: n - 1]'은'aList'로부터 생성 된 새로운 독립적 인리스트입니다; 그것을 정렬해도'aList'에 전혀 영향을 미치지 않습니다. 비슷하게,'insertOne'에서 무엇인가를 반환해도'aList'의 값에는 영향을 미치지 않습니다. – user2357112

+0

세 번째 문제는'insertOne'가 삽입 할 원소와 정렬 된 서브리스트를 삽입해야하지만,'insertOne (n, aList)'는 인덱스와 원하는 원소를 이미 포함하고있는 부분적으로 정렬 된리스트를 전달한다는 것입니다 삽입 할. – user2357112

답변

1

귀하의 sort 방법은 잘못된 것입니다. n은 길이가 aList이며 요소가 아닙니다. insertOne(n, aList)을 사용하여 목록에 넣는 것을 원하지 않을 것입니다. , 기본적으로

def sort(aList): 
    if len(aList)<=1: 
    return aList 
    else: 
    return insertOne(aList[0], sort(aList[1:])) 

당신은 aList을 통과, 당신은 insertOne를 사용하여 정확한 위치에 발생하는 모든 요소를 ​​삽입하고 있습니다 :

은 당신이하고 싶은 것은 이것이다.