728x90
ํฉ๋ณ์ ๋ ฌ์ด๋
- ๋ฆฌ์คํธ๋ฅผ 2๊ฐ์ ๊ท ๋ฑํ ํฌ๊ธฐ๋ก ๋ถํ ํ๊ณ ๋ถํ ๋ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ.
- ์ ๋ ฌ๋ 2๊ฐ์ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ํฉํ์ฌ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค.
- ํฉ๋ณ์ ๋ ฌ์ ์์ ์ ๋ ฌ(Stable)์ ์ํ๋ฉฐ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(Divide and conquer)์ ํ ์ข ๋ฅ์ด๋ค.
๋ถํ ์ ๋ณต์ด๋? ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ๋ค์, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ๋ต
๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ๋๊ฐ ์ฌ๊ทํธ์ถ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
๋ถํ (Divide): ์
๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ ํฌ๊ธฐ์ 2๊ฐ์ ๋ฐฐ์ด๋ก ๋ถํ
์ ๋ณต(Conquer): ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ง ์์ผ๋ฉด ์ฌ๊ท ํธ์ถ์ ์ด์ฉํ์ฌ ๋ค์ ๋ถํ ๋ฐฉ๋ฒ์ ์ฉ
๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด์ ํฉ๋ณํ๋ค.
ํฉ๋ณ์ ๋ ฌ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋
- ์ถ๊ฐ์ ์ธ ๋ฆฌ์คํธ๊ฐ ํ์ํ๋ค
- ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ ๋๋ ํฉ๋ณ ์ ๋ ฌ์ ์ํ์ ์ผ๋ก ํธ์ถํ์ฌ ์ ์ฉํ๋ค.
- ํฉ๋ณ์ ๋ ฌ์์ ์ค์ ๋ก ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋ ์์ ์ 2๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ํฉ๋ณ(Merge)ํ๋ ๋จ๊ณ์ด๋ค.
ํฉ๋ณ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์์
- 2๊ฐ์ ๋ฆฌ์คํธ์ ๊ฐ๋ค์ ์ฒ์๋ถํฐ ํ๋์ฉ ๋น๊ตํ์ฌ ๋ ๊ฐ์ ๋ฆฌ์คํธ์ ๊ฐ ์ค์์ ๋ ์์ ๊ฐ์ ์๋ก์ด ๋ฆฌ์คํธ(sorted)๋ก ์ฎ๊ธด๋ค.
- ๋ ์ค์์ ํ๋๊ฐ ๋๋ ๋๊น์ง ์ด ๊ณผ์ ์ ๋ํ์ดํ๋ค.
- ๋ง์ฝ ๋์ค์์ ํ๋์ ๋ฆฌ์คํธ๊ฐ ๋จผ์ ๋๋๊ฒ ๋๋ฉด ๋๋จธ์ง ๋ฆฌ์คํธ ๊ฐ๋ค์ ์ ๋ถ ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ณต์ฌํ๋ค.
- ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ์๋์ ๋ฆฌ์คํธ๋ก ์ฎ๊ธด๋ค.
ํฉ๋ณ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ C์ฝ๋
# include <stdio.h>
# define MAX_SIZE 8
int sorted[MAX_SIZE]; // ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ด ํ์
// i: ์ ๋ ฌ๋ ์ผ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// j: ์ ๋ ฌ๋ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// k: ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
/* 2๊ฐ์ ์ธ์ ํ ๋ฐฐ์ด list[left...mid]์ list[mid+1...right]์ ํฉ๋ณ ๊ณผ์ */
/* (์ค์ ๋ก ์ซ์๋ค์ด ์ ๋ ฌ๋๋ ๊ณผ์ ) */
void merge(int list[], int left, int mid, int right){
int i, j, k, l;
i = left;
j = mid+1;
k = left;
/* ๋ถํ ์ ๋ ฌ๋ list์ ํฉ๋ณ */
while(i<=mid && j<=right){
if(list[i]<=list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
if(i>mid){
for(l=j; l<=right; l++)
sorted[k++] = list[l];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
else{
for(l=i; l<=mid; l++)
sorted[k++] = list[l];
}
// ๋ฐฐ์ด sorted[](์์ ๋ฐฐ์ด)์ ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด list[]๋ก ์ฌ๋ณต์ฌ
for(l=left; l<=right; l++){
list[l] = sorted[l];
}
}
// ํฉ๋ณ ์ ๋ ฌ
void merge_sort(int list[], int left, int right){
int mid;
if(left<right){
mid = (left+right)/2; // ์ค๊ฐ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๊ท ๋ฑ ๋ถํ -๋ถํ (Divide)
merge_sort(list, left, mid); // ์์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
merge_sort(list, mid+1, right); // ๋ค์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
merge(list, left, mid, right); // ์ ๋ ฌ๋ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ํฉ๋ณํ๋ ๊ณผ์ -๊ฒฐํฉ(Combine)
}
}
int main(void){
int i;
int n = MAX_SIZE;
int list[8] = {21, 10, 12, 20, 25, 13, 15, 22};
// ํฉ๋ณ ์ ๋ ฌ ์ํ(left: ๋ฐฐ์ด์ ์์ = 0, right: ๋ฐฐ์ด์ ๋ = 7)
merge_sort(list, 0, n-1);
// ์ ๋ ฌ ๊ฒฐ๊ณผ ์ถ๋ ฅ
for(i=0; i<n; i++){
printf("%d ", list[i]);
}
}
ํฉ๋ณ์ ๋ ฌ ํน์ง ๋ฐ ์๊ฐ๋ณต์ก๋
์ฅ์
- ์์ ์ ์ธ ์ ๋ ฌ๋ฐฉ๋ฒ, ๋ฐ์ดํฐ์ ๋ถํฌ ์ํฅ์ ๋ ๋ฐ๋๋ค.(์ ๋ ฌ๋๋ ์๊ฐ์ ๋์ผ)
- ๋ง์ฝ ๋ ์ฝ๋๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑํ๋ฉด, ๋งํฌ ์ธ๋ฑ์ค๋ง ๋ณ๊ฒฝ๋๋ฏ๋ก ๋ฐ์ดํฐ์ ์ด๋์ ๋ฌด์ํ ์ ์์์ ๋๋ก ์์์ง๋ค.
- ์ธํ๋ ์ด์ค(in-place sorting)์ผ๋ก ๊ตฌํํ ์ ์๋ค.
- ๋ฐ๋ผ์ ํฌ๊ธฐ๊ฐ ํฐ ๋ ์ฝ๋๋ฅผ ์ ๋ ฌํ ๊ฒฝ์ฐ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ด๋ค ๋ฐฉ๋ฒ๋ณด๋ค ํจ์จ์ ์ด๋ค.
๋จ์
- ๋ง์ฝ ๋ ์ฝ๋๋ฅผ ๋ฐฐ์ด๋ก ๊ตฌ์ฑํ๋ฉด, ์์ ๋ฐฐ์ด์ด ํ์ํ๋ค.
- ์ ์๋ฆฌ ์ ๋ ฌ(in-place)์ด ์๋๊ฒ ๋๋ค.
- ๋ ์ฝ๋๋ค์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ์๋ ์ด๋ํ์๊ฐ ๋ง์ผ๋ฏ๋ก ๋งค์ฐ ํฐ ์๊ฐ์ ๋ญ๋น๋ฅผ ์ด๋ํ๋ค.
ํฉ๋ณ์ ๋ ฌ ์๊ฐ๋ณต์ก๋
๋ถํ ๋จ๊ณ๋ ๋น๊ต ์ฐ์ฐ๊ณผ ์ด๋์ฐ์ฐ์ด ์ํ๋์ง ์๋๋ค.
ํฉ๋ณ๋จ๊ณ๋ ์๋ ์ ๊ฐ๋ค.
- ํฌ๊ธฐ n์ธ ๋ฆฌ์คํธ๋ฅผ ์ ํํ ๊ท ๋ฑ ๋ถ๋ฐฐํ๋ฏ๋ก log(n) ๊ฐ์ ํจ์ค
- ๊ฐ ํจ์ค์์ ๋ฆฌ์คํธ์ ๋ชจ๋ ๋ ์ฝ๋ n๊ฐ๋ฅผ ๋น๊ตํ๋ฏ๋ก n๋ฒ์ ๋น๊ต ์ฐ์ฐ
์ด๋ํ์๋
- ๋ ์ฝ๋์ ์ด๋์ด ๊ฐ ํจ์ค์์ 2n๋ฒ ๋ฐ์ํ๋ฏ๋ก ์ ์ฒด ๋ ์ฝ๋์ ์ด๋์ 2n*log(n)๋ฒ ๋ฐ์
- ๋ ์ฝ๋์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ํฐ ์๊ฐ์ ๋ญ๋น ์ด๋
- ๋ ์ฝ๋๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌ์ฑํ์ฌ ํฉ๋ณ ์ ๋ ฌํ ๊ฒฝ์ฐ, ๋งค์ฐ ํจ์จ์
์ฆ, T(n) = nlogโn(๋น๊ต) + 2nlogโn(์ด๋) = 3nlogโn = O(nlogโn)
728x90