By POSTECH Computer Algorithm Team
정렬
곽성재
Sorting
Contents
POSTECH Computer Algorithm Team
01
정렬의 필요성 00
더 빠른 정렬 02
단순한 정렬
특수한 경우의 정렬 03
연습문제 04
POSTECH Computer Algorithm Team
- 정렬은 특정 데이터들을 효율적으로 관리할 목적으로 사용될 수 있다.
Ex) 이분 탐색 시간에도 언급했듯, 정렬한 리스트에서의 탐색은 정렬되지 않은 상태보다 더 효율적이다.
- 정렬을 사용하면 특정 알고리즘을 더 빠르게 수행할 수 있는 경우가 있다.
Ex) 두 set의 union을 찾는 알고리즘
왜 정렬하는가? 정렬의 필요성
POSTECH Computer Algorithm Team
- 삽입 정렬은 가장 먼저 떠올릴 수 있는 단순한 정렬이다.
- 정렬되지 않은 리스트에서 한 원소를 골라 정렬된 리스트에 적절한 위치를 찾아서 삽입한다.
- 평균적인 시간복잡도는 𝑂(𝑛2
) 이다.
- 추가적인 메모리가 필요하지 않은 제자리(in-place) 정렬이다.
삽입 정렬 (Selection Sort) 단순한 정렬
POSTECH Computer Algorithm Team
- 인접한 두 원소들끼리 비교하며 더 큰 원소를 오른쪽으로 보내는 정렬이다.
- 시간복잡도는 𝑛 − 1 + 𝑛 − 2 + … + 1 ∈ 𝑂(𝑛2
) 이다.
- 마찬가지로 제자리 정렬이다.
거품 정렬 (Bubble Sort) 단순한 정렬
POSTECH Computer Algorithm Team
- 데이터 처리에서, 데이터의 양이 n = 1,000,000,000 혹은 그 이상인 경우가 있다.
- 하지만 앞의 두 정렬은 모두 평균적인 시간복잡도가 𝑂(𝑛2
) 이므로, 정렬에 엄청나게 많은 시간이 소요된다.
- 시간복잡도가 𝑂(𝑛 log 𝑛) 인 정렬 알고리즘을 사용하자.
더 빠른 정렬의 필요성 더 빠른 정렬
POSTECH Computer Algorithm Team
- Divide and Conquer 전략을 사용한다.
- 주어진 배열을 2개로 나눈 뒤 (Divide), 두 배열에 대해 다시 합병 정렬을 하고 (Recurse), 정렬된 두 배열을 병
합한다 (Merge).
병합 정렬 (Merge Sort) 더 빠른 정렬
Depth ≅ log2 𝑛
POSTECH Computer Algorithm Team
- Divide에 constant time 𝑎, Merge에 𝑘𝑛의 시간이 걸리므로 점화식 𝑓 𝑛 = 𝑎 + 2𝑓
𝑛
2
+ 𝑘𝑛 을 얻는다.
- 𝑓 𝑛 = 𝑎 + 𝑘𝑛 + 2 𝑎 +
𝑘𝑛
2
+ 2 𝑎 +
𝑘𝑛
4
+ ⋯ = 𝑎 + 𝑘𝑛 + 2𝑎 + 𝑘𝑛 + 4𝑎 + 𝑘𝑛 + ⋯ ≅ 𝑘𝑛 log2 𝑛 + 𝑎𝑛
- 점화식으로부터 시간복잡도 𝑂 𝑛 log 𝑛 을 얻는다.
- 또한 Merge 과정에서 같은 크기의 임시 배열을 필요로 하므로 공간복잡도는 𝑂 𝑛 이다.
병합 정렬 (Merge Sort) 분석 더 빠른 정렬
POSTECH Computer Algorithm Team
- Merge Sort와 마찬가지로 Divide and Conquer 전략을 사용한다.
- 정렬할 배열에서 무작위로 pivot을 뽑은 다음, pivot보다 작은 배열과 pivot보다 큰 배열로 나눈다 (Divide).
- 나누어진 두 배열에 대해 다시 퀵 정렬을 한다 (Recurse).
- Merge Sort와는 다르게 subarray의 크기가 동일하지 않을 수도 있다.
퀵 정렬 (Quick Sort) 더 빠른 정렬
POSTECH Computer Algorithm Team
- 무작위 pivot을 선택한다면 subarray가 비슷한 크기로 나누어짐을 기대할 수 있으므로 Recursion에 2𝑓
𝑛
2
의 시
간이 걸림을 가정한다. Divide에 𝑘𝑛의 시간이 걸리므로 점화식 𝑓 𝑛 = 𝑘𝑛 + 2𝑓
𝑛
2
을 얻는다.
- 𝑓 𝑛 = 𝑘𝑛 + 2
𝑘𝑛
2
+ 2
𝑘𝑛
4
+ ⋯ = 𝑘𝑛 + 𝑘𝑛 + 𝑘𝑛 + ⋯ ≅ 𝑘𝑛 log2 𝑛
- 점화식으로부터 시간복잡도 𝑂 𝑛 log 𝑛 을 얻는다.
- Bubble Sort와 마찬가지로 제자리 정렬에 해당하므로, 추가로 사용하는 메모리는 Recursion을 위한 스택 메모리
뿐이다. 따라서 공간복잡도는 𝑂 log 𝑛 이다.
퀵 정렬 (Quick Sort) 분석 더 빠른 정렬
POSTECH Computer Algorithm Team
- Base n Radix Sort는 주어진 자연수들을 n진수로 나타내서 각 자릿수를 사용하여 정렬한다.
- Ex) 13 4 20 5 112  20 112 13 4 5  4 5 112 13 20  4 5 13 20 112 (Base 10 Radix Sort)
- 가장 큰 수의 자리수가 𝑑일 때, 시간복잡도는 𝑂(𝑑𝑛) 이다.
- 따라서 수가 정해진 구간 내에 분포하고 있는 경우엔 𝑑의 최댓값이 일정하므로, 𝑂(𝑛)의 시간복잡도를 기대할 수
있다.
기수 정렬 (Radix Sort) 특수한 경우의 정렬
POSTECH Computer Algorithm Team
- 수가 정해진 구간 내에 분포하고 있는 경우에 사용할 수 있다.
- For x in unsorted_array: count_array[x] += 1
- 정렬할 배열의 원소들을 단 한번씩만 참조하므로 시간복잡도는 𝑂(𝑛)이다.
카운팅 소트 (Counting Sort) 특수한 경우의 정렬
POSTECH Computer Algorithm Team
- Counting Sort
https://www.acmicpc.net/problem/10989
- Radix Sort
https://www.acmicpc.net/problem/1181
- Merge Sort / Quick Sort
https://www.acmicpc.net/problem/2751
- Sorting + Binary Search
https://www.acmicpc.net/problem/3020
연습문제 (백준) 연습문제
POSCAT
Thank you :-)

06. sorting

  • 1.
    By POSTECH ComputerAlgorithm Team 정렬 곽성재 Sorting
  • 2.
    Contents POSTECH Computer AlgorithmTeam 01 정렬의 필요성 00 더 빠른 정렬 02 단순한 정렬 특수한 경우의 정렬 03 연습문제 04
  • 3.
    POSTECH Computer AlgorithmTeam - 정렬은 특정 데이터들을 효율적으로 관리할 목적으로 사용될 수 있다. Ex) 이분 탐색 시간에도 언급했듯, 정렬한 리스트에서의 탐색은 정렬되지 않은 상태보다 더 효율적이다. - 정렬을 사용하면 특정 알고리즘을 더 빠르게 수행할 수 있는 경우가 있다. Ex) 두 set의 union을 찾는 알고리즘 왜 정렬하는가? 정렬의 필요성
  • 4.
    POSTECH Computer AlgorithmTeam - 삽입 정렬은 가장 먼저 떠올릴 수 있는 단순한 정렬이다. - 정렬되지 않은 리스트에서 한 원소를 골라 정렬된 리스트에 적절한 위치를 찾아서 삽입한다. - 평균적인 시간복잡도는 𝑂(𝑛2 ) 이다. - 추가적인 메모리가 필요하지 않은 제자리(in-place) 정렬이다. 삽입 정렬 (Selection Sort) 단순한 정렬
  • 5.
    POSTECH Computer AlgorithmTeam - 인접한 두 원소들끼리 비교하며 더 큰 원소를 오른쪽으로 보내는 정렬이다. - 시간복잡도는 𝑛 − 1 + 𝑛 − 2 + … + 1 ∈ 𝑂(𝑛2 ) 이다. - 마찬가지로 제자리 정렬이다. 거품 정렬 (Bubble Sort) 단순한 정렬
  • 6.
    POSTECH Computer AlgorithmTeam - 데이터 처리에서, 데이터의 양이 n = 1,000,000,000 혹은 그 이상인 경우가 있다. - 하지만 앞의 두 정렬은 모두 평균적인 시간복잡도가 𝑂(𝑛2 ) 이므로, 정렬에 엄청나게 많은 시간이 소요된다. - 시간복잡도가 𝑂(𝑛 log 𝑛) 인 정렬 알고리즘을 사용하자. 더 빠른 정렬의 필요성 더 빠른 정렬
  • 7.
    POSTECH Computer AlgorithmTeam - Divide and Conquer 전략을 사용한다. - 주어진 배열을 2개로 나눈 뒤 (Divide), 두 배열에 대해 다시 합병 정렬을 하고 (Recurse), 정렬된 두 배열을 병 합한다 (Merge). 병합 정렬 (Merge Sort) 더 빠른 정렬 Depth ≅ log2 𝑛
  • 8.
    POSTECH Computer AlgorithmTeam - Divide에 constant time 𝑎, Merge에 𝑘𝑛의 시간이 걸리므로 점화식 𝑓 𝑛 = 𝑎 + 2𝑓 𝑛 2 + 𝑘𝑛 을 얻는다. - 𝑓 𝑛 = 𝑎 + 𝑘𝑛 + 2 𝑎 + 𝑘𝑛 2 + 2 𝑎 + 𝑘𝑛 4 + ⋯ = 𝑎 + 𝑘𝑛 + 2𝑎 + 𝑘𝑛 + 4𝑎 + 𝑘𝑛 + ⋯ ≅ 𝑘𝑛 log2 𝑛 + 𝑎𝑛 - 점화식으로부터 시간복잡도 𝑂 𝑛 log 𝑛 을 얻는다. - 또한 Merge 과정에서 같은 크기의 임시 배열을 필요로 하므로 공간복잡도는 𝑂 𝑛 이다. 병합 정렬 (Merge Sort) 분석 더 빠른 정렬
  • 9.
    POSTECH Computer AlgorithmTeam - Merge Sort와 마찬가지로 Divide and Conquer 전략을 사용한다. - 정렬할 배열에서 무작위로 pivot을 뽑은 다음, pivot보다 작은 배열과 pivot보다 큰 배열로 나눈다 (Divide). - 나누어진 두 배열에 대해 다시 퀵 정렬을 한다 (Recurse). - Merge Sort와는 다르게 subarray의 크기가 동일하지 않을 수도 있다. 퀵 정렬 (Quick Sort) 더 빠른 정렬
  • 10.
    POSTECH Computer AlgorithmTeam - 무작위 pivot을 선택한다면 subarray가 비슷한 크기로 나누어짐을 기대할 수 있으므로 Recursion에 2𝑓 𝑛 2 의 시 간이 걸림을 가정한다. Divide에 𝑘𝑛의 시간이 걸리므로 점화식 𝑓 𝑛 = 𝑘𝑛 + 2𝑓 𝑛 2 을 얻는다. - 𝑓 𝑛 = 𝑘𝑛 + 2 𝑘𝑛 2 + 2 𝑘𝑛 4 + ⋯ = 𝑘𝑛 + 𝑘𝑛 + 𝑘𝑛 + ⋯ ≅ 𝑘𝑛 log2 𝑛 - 점화식으로부터 시간복잡도 𝑂 𝑛 log 𝑛 을 얻는다. - Bubble Sort와 마찬가지로 제자리 정렬에 해당하므로, 추가로 사용하는 메모리는 Recursion을 위한 스택 메모리 뿐이다. 따라서 공간복잡도는 𝑂 log 𝑛 이다. 퀵 정렬 (Quick Sort) 분석 더 빠른 정렬
  • 11.
    POSTECH Computer AlgorithmTeam - Base n Radix Sort는 주어진 자연수들을 n진수로 나타내서 각 자릿수를 사용하여 정렬한다. - Ex) 13 4 20 5 112  20 112 13 4 5  4 5 112 13 20  4 5 13 20 112 (Base 10 Radix Sort) - 가장 큰 수의 자리수가 𝑑일 때, 시간복잡도는 𝑂(𝑑𝑛) 이다. - 따라서 수가 정해진 구간 내에 분포하고 있는 경우엔 𝑑의 최댓값이 일정하므로, 𝑂(𝑛)의 시간복잡도를 기대할 수 있다. 기수 정렬 (Radix Sort) 특수한 경우의 정렬
  • 12.
    POSTECH Computer AlgorithmTeam - 수가 정해진 구간 내에 분포하고 있는 경우에 사용할 수 있다. - For x in unsorted_array: count_array[x] += 1 - 정렬할 배열의 원소들을 단 한번씩만 참조하므로 시간복잡도는 𝑂(𝑛)이다. 카운팅 소트 (Counting Sort) 특수한 경우의 정렬
  • 13.
    POSTECH Computer AlgorithmTeam - Counting Sort https://www.acmicpc.net/problem/10989 - Radix Sort https://www.acmicpc.net/problem/1181 - Merge Sort / Quick Sort https://www.acmicpc.net/problem/2751 - Sorting + Binary Search https://www.acmicpc.net/problem/3020 연습문제 (백준) 연습문제
  • 14.