힙 정렬 (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

+ Recent posts