2013-05-19 2 views
4

나는 알고리즘의 책을 통해 파이썬 구현을 시도하고있다. 파이썬에는이 함수가 내장되어있을 것이라고 확신하지만 언어를 조금 배우는 것이 좋은 운동이라고 생각했습니다.파이썬 목록의 역순 숫자 정렬

주어진 알고리즘은 숫자 배열에 대한 삽입 정렬 루프를 만드는 것이 었습니다. 이것은 잘 작동 할 수있었습니다. 그런 다음 역순 정렬 (가장 큰 수에서 가장 낮은 수)을 수행하도록 수정하려고했습니다. 출력은 거의 없지만 어디서 잘못 될지 잘 모르겠습니다.

첫째, 증가 숫자의 정렬 :

sort_this = [31,41,59,26,41,58] 
print sort_this 

for j in range(1,len(sort_this)): 
    key = sort_this[j] 
    i = j - 1 
    while i >= 0 and sort_this[i] > key: 
     sort_this[i + 1] = sort_this[i] 
     i -= 1 
    sort_this[i + 1] = key 
    print sort_this 

자, 반대 일종의 작동하지 않습니다

sort_this = [5,2,4,6,1,3] 
print sort_this 

for j in range(len(sort_this)-2, 0, -1): 
    key = sort_this[j] 
    i = j + 1 
    while i < len(sort_this) and sort_this[i] > key: 
     sort_this[i - 1] = sort_this[i] 
     i += 1 
     print sort_this 
    sort_this[i - 1] = key 
    print sort_this 

위의 출력은 다음과 같습니다

[5, 2, 4, 6, 1, 3] 
[5, 2, 4, 6, 3, 3] 
[5, 2, 4, 6, 3, 1] 
[5, 2, 4, 6, 3, 1] 
[5, 2, 6, 6, 3, 1] 
[5, 2, 6, 4, 3, 1] 
[5, 6, 6, 4, 3, 1] 
[5, 6, 4, 4, 3, 1] 
[5, 6, 4, 3, 3, 1] 
[5, 6, 4, 3, 2, 1] 

최종 배열은 처음 두 숫자를 제외하고 거의 정렬됩니다. 내가 어디로 잘못 갔니?

+1

으로 변경하십시오. 왜 그냥'sort_this [i]

답변

8

range에는 최종 값이 포함되지 않습니다. range(len(sort_this)-2, 0, -1)을 실행하면 len(sort_this)-2에서 1로 반복되므로 첫 번째 요소 (인덱스 0)에 절대 도달하지 않습니다. 범위를 range(len(sort_this)-2, -1, -1)