라떼군 이야기


13 / 14강

정렬과 기준 선택

점수는 낮은 순서로, 파일은 수정한 날짜순으로 정리할 수 있습니다. 이것이 정렬입니다. 먼저 무엇을 기준으로 비교할지 정해야 합니다. 점수가 같을 때 원래 순서를 유지할지도 결정해야 합니다.

삽입 정렬 따라가기

손에 든 카드를 정리하듯, 왼쪽의 정렬된 부분에 다음 항목을 끼워 넣습니다.

시작      [7, 3, 5, 2]
3 삽입    [3, 7, 5, 2]
5 삽입    [3, 5, 7, 2]
2 삽입    [2, 3, 5, 7]
def insertion_sort(values):
    for i in range(1, len(values)):
        value = values[i]
        j = i - 1
        while j >= 0 and values[j] > value:
            values[j + 1] = values[j]
            j -= 1
        values[j + 1] = value

numbers = [7, 3, 5, 2]
insertion_sort(numbers)
print(numbers)

출력은 [2, 3, 5, 7]입니다. 반복을 시작할 때 i의 왼쪽은 이미 정렬되어 있습니다. 다음 값을 넣어도 그 규칙이 유지되므로 마지막에는 전체가 정렬됩니다.

방법마다 다른 비용

기수 정렬은 자릿수별로 분류합니다. 비교 정렬과 전제가 달라 자릿수와 사용할 기호의 범위까지 비용에 포함해야 합니다.

같은 값의 순서도 중요합니다

동일한 키를 가진 항목의 원래 순서를 유지하면 안정 정렬입니다. 위 삽입 정렬은 >일 때만 밀어서 같은 값의 순서를 유지합니다. Python의 sorted()list.sort()도 안정 정렬을 보장합니다.

확인 문제

위 코드의 >>=로 바꾸면 같은 점수를 받은 사람들의 접수 순서가 유지될까요?

해설 보기

보장하지 않습니다. 같은 값도 오른쪽으로 밀면서 나중에 온 항목을 앞에 넣게 됩니다. 숫자만 보면 같아 보여도 사람 이름처럼 함께 붙어 있는 정보의 순서가 바뀝니다.

Python 공식 문서: 정렬의 안정성

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.