선택 정렬 (Selection Sort)

selectionSort(A[n], n)
{
	for last ← n downto 2{
		A[1…n] 중 가장 큰 수 A[k]를 찾는다;
		A[k] ↔ A[last];
	}
}

선택 정렬의 수행 시간은 모든 경우에 $\Theta(n^2)$

 

버블 정렬 (Bubble Sort)

bubbleSort(A[], n)
{
	for last ← n downto 2
		for i ← 1 to last-1
			if (A[i] > A[i+1]) then A[i] ↔ A[i+1];
}

버블 정렬의 수행 시간은 $\Theta(n^2)$

 

중간에 정렬이 완료될 경우, 무의미한 순환을 멈추기 위한, 변형된 버블 정렬

bubbleSort2(A[], n)
{
	for last ← n downto 2{
		sorted ← TRUE;
		for i ← 1 to last-1{
			if (A[i] > A[i+1]) then {
				A[i] ↔ A[i+1];
				sorted ← FALSE;
			}
		}
		if (sorted == TRUE) then return;
	}
}

 

삽입 정렬 (Insertion Sort)

insertionSort(A[], n)
{
	for i ← 2 to n
		A[1…i]의 적합한 자리에 A[i]를 삽입한다;
}

최악의 경우에도 수행 시간은 $\Theta(n^2)$

 

선택 정렬, 버블 정렬, 삽입 정렬은 모두 수학적 귀납법으로 증명 가능

 

병합 정렬 (Merge Sort)

mergeSort(A[], p, r)
{
	if(p<r) then{
		q ← (p+r)/2;
		mergeSort(A, p, q);
		mergeSort(A, q+1, r);
		merge(A, p, q, r);
	}
}

merge(A[], p, q, r)
{
	정렬되어 있는 두 배열 A[p…q]와 A[q+1…r]을 합쳐
	정렬된 하나의 배열 A[p…r]을 만든다.
}

병합정렬에서 시간복잡도를 계산하면,

$$\begin{align}T(n)&\leq 2T(n/2)+cn\\ &\leq 2(2T(n/4) +c\cdot (n/2)) +cn = 2^2 T(n/2^2) + 2cn\\ &\leq 2^2 (2T(n/2^3) + c\cdot (n/2^2 ))+2cn = 2^3 T(n/2^3) +3cn\\ &\cdots \\&\leq 2^k T(n/2^k) +kcn\\ &= nT(1) + kcn = an+cnlogn\\ &= \Theta(nlogn)\end{align}$$

병합 정렬의 수행 시간은 최악의 경우 $\Theta(nlogn)$

 

퀵 정렬 (Quick Sort)

quickSort(A[], p, r)
{
	if (p<r) then{
		q ← partition(A, p, r);
		quickSort(A, p, q-1);
		quickSort(A, q+1, r);
	}
}

partition(A[], p, r)
{
	x ← A[r];
	i ← p-1;
	for j ← p to r-1
		if (A[j]≤x) then A[++i] ↔ A[j];
	A[i+1] ↔ A[r];
	return i+1;
}

평균적인 경우 시간복잡도는,

$$T(n)=2T(n/2) + \Theta(n)$$

$$\therefore T(n)=\Theta(nlogn)$$

최악의 경우 시간복잡도는,

$$T(n)=T(n-1)+\Theta(n)$$

$$\therefore T(n)=\Theta(n^2)$$

'쉽게 배우는 알고리즘' 카테고리의 다른 글

05 선택 알고리즘  (0) 2018.10.21
04 정렬 (2)  (0) 2018.10.21
03 점화식과 알고리즘 복잡도 분석  (0) 2018.10.20
02 알고리즘 설계와 분석의 기초  (2) 2018.10.19
01 알고리즘이란  (5) 2018.10.18

+ Recent posts