algorithm(1) sort
Mar 7, 2023
Sorting
- 정렬을 왜 할까?
- 탐색할 때 좋다.
- $\therefore$ Searching 과 Sorting 을 연관해서 생각하면 됨.
Search
-
Terms
- List: 하나 이상의 field 로 된 record 의 집합
- Key: A Field used to specify the record
-
순차 탐색(Sequential Search)
- one-way 로 record 를 검사하는 것
- $O(N)$ 의 시간이 걸림
-
이진 탐색 (Binary Search)
- 키에 따라 정렬되어 있다고 가정
- $O(\log N)$ 로 시간을 줄일 수 있음
- 한 번의 탐색마다 전체 space 가 절반이 되기 때문 $$ \begin{align} \frac{n}{2}, \frac{n}{2^2}, \cdots, \frac{n}{2^k} \newline 2^k = n \newline \therefore k = \log n \end{align} $$
-
Space 크기가 작다면 그냥 Sequential Search 를 하는게 효율적일 수 있다.
-
보간법(Interpolation) 탐색
- 리스트가 정렬되었다고 가정함
- 탐색의 성질은 리스트에 있는 키의 분포에 달려있음
- 리스트를 반복해서 탐색할 때 정렬 상태를 유지하는 것이 유리함
The Sorting Problem (Def)
- Input, Output 이 정의된 뒤 방법이 소개되는 양식이 있다고 함
Input
- A seq of n numbers: $a_1$
정렬의 필요성(?, misc)
- 활용
- 탐색에서 보조로 사용
- 리스트의 엔트리를 비교
- 방법
- Internal methods
- Space 가 작아서, On-Memory 가 가능할 때
- External methods
- Space 가 클 때
- 즉, HDD 등의 보조 기억장치를 이용하는 정렬
- File System 과목에서 배움
- Internal methods
정렬 종류
$O(n^2)$
- Bubble sort
- Insertion sort
- Selection sort
$O(N \log N)$
- Quick Sort
- Merge Sort
- Heap Sort
반칙? (부가적인 자원을 가져와서 정렬한다고 함)
- Radix Sort
bubble sort
- 아이디어
- List 의 인접한 원소를 자리바꿈하여 정렬함
- ex) 가장 큰 값을 오른쪽으로 계속 보냄
- 구현은 매우 쉽지만, Insertion Sort 보다 느림
Bubble-sort running time Calc
BUBBLESORT(A)
for i <- 1 to length[A]
do for j - length[A] downto i+1
do if A[j] < A[j - 1]
then exchange A[j] <-> A[j-1]
- line 2, 3, 4, 5 를 각각 $c_1, c_2, c_3, c_4$ 라고 하자
- 전체 시간 $T(n)$ 을 아래와 같이 계산할 수 있다. $$T(n) = c_1(n+1) + c_2\sum_{i=1}^n (n - i + 1) + c_3\sum_{i=1}^n$$
아무튼, $n+1$ 에서 $+1$ 하는 이유는, for
, while
등은 마지막으로 한번 더 돌기 때문에 붙여준다.
Insertion Sort
- Unsorted List ---> Sorted List
- 과정을 진행할 때, array 를 두 부분의 sub-array(unsorted, sorted) 로 구분함.
- (Redundant 한 작업인 것 같아도, 일일이 다 비교해야함)
INSERTION_SORT(A)
for j <- 2 to n
do key <- A[j]
// i: Sorted List 에서 비교 대상을 바꾸는 것
i <- j - 1
while i > 0 and A[i] > key
do A[i + 1] <- A[i]
i <- i - 1
A[i + 1] <- key
Best Case Analysis
- 만약 미리 정렬이 되었다면, 자리바꿈 없이 linear time $O(N)$ 내에 작업을 완료할 수 있음
Worst Case Analysis
-
만약 반대로 정렬이 되어있다면, $O(N^2)$ 가 걸림
-
즉, Ordering 이 중요함
Selection Sort
-
정렬을 하면서 깃발을 꼽음
-
깃발이 위치한 곳을 선택했다고 생각하면 됨
-
아이디어:
- list 에서 가장 작은/큰 원소를 찾음
- 발견된 원소를 맨 앞/뒤 원소와 Swap
- 정렬된 원소를 제외한 $N-1$ 개의 원소에 대해 위 두 과정을 반복함
-
Bubble sort 와 비슷하지만, 여기서는 한 번만 Swap 하면 됨
-
Ordering (Sorting) 이 잘 되어 있어도 별 효용은 없음
SELECTION_SORT(A)
n ← length[A]
for j ← 1 to n - 1
// j: index (최저값의 위치)
do smallest ← j
for i ← j + 1 to n
do if A[i] < A[smallest]
then smallest ← i
exchange A[j] ↔ A[smallest]
- (Best, Worst case Analysis)