본문 바로가기

정렬5

알고리즘 - 병합 정렬 병합 정렬은 배열을 두 그룹으로 나누어 각각 정렬한 후 병합하는 작업을 반복하는 알고리즘입니다. 먼저, 정렬된 배열 a, b를 반복문을 이용한 단순 병합을 해보겠습니다. 이럴 경우 병합하는데 필요한 시간 복잡도는 O(n)입니다. def merge_sorted_list(a, b, c) -> None: pa, pb, pc = 0, 0, 0 # 각 배열의 커서 na, nb, nc = len(a), len(b), len(c) # 각 배열의 크기 print(f'배열 a: {a}') print(f'배열 b: {b}') while pa None: if left < right: center =.. 2020. 12. 8.
알고리즘 - 퀵 정렬(1) 퀵 정렬은 가장 빠른 정렬 알고리즘으로 알려져 있으며 널리 사용됩니다. 퀵 정렬은 배열 어느 한 기준(피벗)으로 나누어 두 배열로 만들고 나누어진 배열에서도 기준(피벗)을 잡고 계속해서 두 배열로 나누어 모든 그룹에 원소 하나가 남으면 정렬이 완료됩니다. PC가 기준이고 PL, PR은 각각 왼쪽, 오른쪽 커서입니다. 기준이 6이므로 왼쪽에는 6보다 작은 수, 오른쪽에는 6보다 큰 수를 이동시키면 됩니다. 먼저 5와 8은 정렬 시킬 필요가 없습니다. 다음으로 7과 9인데 둘 다 6보다 커서 정렬을 할 수 없습니다. 이럴 때는 PR이 정렬 가능한 수를 찾을 때까지 왼쪽으로 이동시켜 줍니다. 7과 3은 정렬 가능하므로 3과 7의 차리를 바꿔줍니다. 이번에는 1, 2 두 수 모두 기준인 6보다 큽니다. 6보다 .. 2020. 12. 1.
알고리즘 - 셸 정렬 단순 삽입 정렬의 장점은 살리고 단점을 보완해, 더 빠르게 정렬하는 알고리즘을 셸 정렬이라고 합니다. 셸 정렬은 먼저 정렬할 배열의 원소를 그룹으로 나누어, 각 그룹별로 정렬을 수행합니다. 그리고 정렬된 그룹을 합치는 작업을 반복하여 원소의 이동 횟수를 줄이는 방법입니다. 위와 같이 8개의 원소를 갖는 배열이 있을 때, 단순 삽입 정렬은 1을 맨 앞으로 이동시킬 때 총 7번 이동시켜야 합니다. 셸 정렬을 하면 먼저 서로 4칸씩 떨어진 원소를 꺼내어 4개의 그룹으로 나누고 그룹별로 각각 정렬합니다. (8, 5), (4, 2), (9, 7), (6, 1) --> (5, 8), (2, 4), (7,9), (1, 6) 이렇게 4칸 떨어진 원소를 정렬하는 방법을 4-정렬이라고 합니다. 이어서 2칸 떨어진 원소를 .. 2020. 11. 24.
알고리즘 - 이진 삽입 정렬 단순 삽입 정렬은 배열 원소 수가 많이지면 비교, 교환 비용이 커지는데 이진 삽입 정렬을 사용하면 정렬을 마친 배열을 제외하고 원소를 삽입해야 할 위치를 검사해서 비용을 줄일 수 있습니다. def binary_insertion_sort(a): n = len(a) for i in range(1, n): key = a[i] pl = 0 pr = i - 1 while True: pc = (pl + pr) // 2 if a[pc] == key: break elif a[pc] pr: break if pl > a[0] = 4 이렇게 교환이 됩니다. 이렇게 검색 범위를 축소하고 가운데 값을 기준으로 검색 범위를 좁혀 나가는 것이 이진 삽.. 2020. 11. 23.