힙 정렬 (Heap Sort)
buildHeap(A[], n)
{
for i ← n/2 downto 1
heapify(A, i, n);
}
heapify(A[], k, n)
{
left ← 2k; right ← 2k+1;
if (right ≤ n) then {
if (A[left] < A[right]) then smaller ← left;
else smaller ← right;
}
else if (left ≤ n) then smaller ← left;
else return;
if (A[smaller] < A[k]) then {
A[k] ↔ A[smaller];
heapify(A, smaller, n);
}
}
heapSort(A, n)
{
buildHeap(A, n);
for i ← n downto 2 {
A[1] ↔ A[i];
heapify(A, 1, i-1);
}
}
힙 정렬의 수행시간은 $O(nlogn)$
+) 비교 연산을 기본으로 하는 정렬은 시간 복잡도가 최소 $\Omega(nlogn)$이다.
하지만 원소들이 특수한 성질을 만족하면 $O(n)$도 가능하다.
기수 정렬 (Radix Sort)
입력이 모두 k 자릿수 이하의 자연수인 특수한 경우에 사용가능
radixSort(A[], n, k)
{
for i ← 1 to k
i번째 자릿수에 대해 A[1…n]을 안정성을 유지하면서 정렬;
}
안정성을 유지하면서 '정렬'할때,
0부터 9까지 표시된 10개의 공간을 준비해놓고 원소를 해당 공간에 차례대로 넣어주는 등의 방법을 사용
시간복잡도는 $O(n)$
계수 정렬 (Counting Sort)
원소들의 값이 $O(n)$을 넘지 않는 경우에 사용가능
countingSort(A[], B[], n)
{
for i ← 1 to k
C[i] ← 0;
for j ← 1 to n
C[A[j]]++;
for i ← 2 to k
C[i] ← C[i] + C[i-1];
for j ← n downto 1 {
B[C[A[j]]] ← A[j];
C[A[j]]--;
}
}
계수 정렬의 수행시간은 $\Theta(n)$인데 그 이유는 다음과 같다.
첫번째 for loop는 $\Theta(k)$
두번째 for loop는 $\Theta(n)$
세번째 for loop는 $\Theta(k)$
네번째 for loop는 $\Theta(n)$
따라서, k가 $O(n)$이면 총 시간은 $\Theta(n)$
'쉽게 배우는 알고리즘' 카테고리의 다른 글
| 06 검색 트리 (0) | 2018.10.21 |
|---|---|
| 05 선택 알고리즘 (0) | 2018.10.21 |
| 04 정렬 (1) (0) | 2018.10.21 |
| 03 점화식과 알고리즘 복잡도 분석 (0) | 2018.10.20 |
| 02 알고리즘 설계와 분석의 기초 (2) | 2018.10.19 |