UNIT 08 (정렬)

정우석·2024년 5월 10일

삽입 정렬

문제) 리스트 안의 자료를 작은 수부터 큰 수 순서로 배열하는 알고리즘을 만들어라.

#쉽게 설명한 삽입 정렬
#입력 : 리스트 a
#출력 : 정렬된 새 리스트

def find_ins_idx(r, v):
    for i in range(0, len(r)):
        if v < r[i]:
            return i
    return len(r)


def ins_sort(a):
    result = []
    while a:
        value = a.pop(0)
        ins_idx = find_ins_idx(result, value)
        result.insert(ins_idx, value) #찾은 위치에 값 삽입(이후 값은 한 칸씩 밀려남)
    return result


d = [2, 4, 5, 1, 3]
print(ins_sort(d))
#삽입 정렬
#입력 : 리스트a
#출력 : 없음(입력으로 주어진 a가 정렬됨)

def ins_sort(a):
    n = len(a)
    for i in range(1, n):
        key = a[i]
        j = i - 1
        while j >= 0 and a[j] > key:
            a[j + 1] = a[j]
            j -= 1
            a[j + 1] = key


d = [2, 4, 5, 1, 3]
ins_sort(d)
print(d)

연습문제

8-1) 일반적인 삽입 정렬 알고리즘을 사용해서 리스트 [2, 4, 5, 1, 3]을 정렬하는 과정을 적어라.

| 2 4 5 1 3
2 | 4 5 1 3
2 4 | 5 1 3
2 4 5 | 1 3
1 2 4 | 5 3
1 2 4 5 | 3
1 2 3 4 | 5
1 2 3 4 5 |

8-2) Unit 8에서 설명한 정렬 알고리즘은 숫자를 작은 수에서 큰 수 순서로 나열하는 오름차순 정렬이었다. 이를 큰 수에서 작은 수 순서로 나열하는 내림차순 정렬로 바꾸려면 프로그램의 어느 부분을 바꿔야 하는가?

a[j] < key 에서 부등호 '>'를 '<'로 바꾼다.

def ins_sort(a):
    n = len(a)
    for i in range(1, n):
        key = a[i]
        j = i - 1
        while j >= 0 and a[j] < key:
            a[j + 1] = a[j]
            j -= 1
            a[j + 1] = key


d = [2, 4, 5, 1, 3]
ins_sort(d)
print(d)

출처

모두의 파이썬&알고리즘 합본호 / 이승찬 / 길벗 / 2018-12-10

0개의 댓글