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) 특수한 경우의 정렬