๋ฐ์ํ
๐Merge Sort ๋ณํฉ ์ ๋ ฌ
- ๋ถํ (Divide): ์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ํฌ๊ธฐ์ 2๊ฐ์ ๋ฆฌ์คํธ๋ก ๋ถํ ํ๋ค.
- ์ ๋ณต(Conquer): ๊ฐ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๊ณ , ๊ฐ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ ๋ ๋ถํ ๊ฐ๋ฅํ๋ค๋ฉด ์ฌ๊ท์ ์ผ๋ก ๋ถํ ์ ๋ณต์ ๋ฐ๋ณตํ๋ค.
- ๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๊ฐ ๋ฆฌ์คํธ๋ฅผ ํ๋์ ๋ฆฌ์คํธ๋ก ํฉ์น๋ค.
๐puedo code ๊ตฌํ
split
- ๋ง์ฝ ๋ฆฌ์คํธ ๊ฐ์๊ฐ ํ ๊ฐ์ด๋ฉด ํด๋น ๊ฐ ๋ฆฌํด
- ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฆฌ์คํธ๋ฅผ left์ right๋ก ๋๋๊ธฐ (์ฌ๊ท์ฉ๋ฒ์ ์ด์ฉํ์ฌ ๋ฆฌ์คํธ ๊ฐ์๊ฐ ํ ๊ฐ๊ฐ ๋ ๋๊น์ง(๋์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง))
- left = split(์)
- right = split(๋ค)
- left์ right ํฉ์น๊ธฐ
merge
- ์ ๋ ฌ๋ ์ซ์๋ค์ ๋ฃ์ ๋ฆฌ์คํธ ์์ฑ (sorted)
- left์ right์ ๋น๊ตํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ๊ฐ์ index๋ฅผ ์ ์ฅํ ๋ณ์ ์์ฑ (left_index, right_index)
- while left_index < len(left) or right_index < len(right): (์์ง ๋น๊ตํ ๋ฐ์ดํฐ๊ฐ ๋จ์์์ผ๋ฉด)
- left๋ right ๋ ์ค ํ๋๊ฐ ์ด๋ฏธ ์ํํ์ฌ ๋น๊ต๊ฐ ์๋ฃ๋์๋ค๋ฉด ๊ทธ ๋ฐ๋์ชฝ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ค์ ๋ฃ๊ณ ํด๋น index +1. left, right ๊ฐ๊ฐ์ ๋ชจ๋ ์ ๋ ฌ์๋ฃ๋ ๋ฆฌ์คํธ์ด๊ธฐ ๋๋ฌธ
- left[left_index]๊ฐ right[right_index]๋ณด๋ค ์์ผ๋ฉด left[left_index]๋ฅผ sorted์ ์ถ๊ฐ
- right[right_index]๊ฐ right[right_index]๋ณด๋ค ํฌ๋ฉด right[right_index]๋ฅผ sorted์ ์ถ๊ฐ
๐์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(C)
int sorted[N];
void merge(int *list, int left, int mid, int right){
int i, j, k, l;
i = left;
j = mid+1;
k = left;
while(i<=mid && j<=right){
if(list[i]<=list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
while (i <= mid)
sorted[k++] = list[i++];
while (j <= right)
sorted[k++] = list[j++];
for(l=left; l<=right; l++)
list[l] = sorted[l];
}
void merge_sort(int *num_arr, int left, int right){
int mid;
if (left < right) {
mid = (left + right) / 2;
merge_sort(num_arr, left, mid);
merge_sort(num_arr, mid+1, right);
merge(num_arr, left, mid, right);
}
}
๐์๊ณ ๋ฆฌ์ฆ ๊ตฌํ(Python)
def merge_sort(num_list):
i, j, k = 0, 0, 0
if len(num_list) == 1:
return num_list
mid = len(num_list) // 2
left_list = num_list[:mid]
right_list = num_list[mid:]
merge_sort(left_list)
merge_sort(right_list)
while (i < len(left_list) and j < len(right_list)):
if (left_list[i] <= right_list[j]):
num_list[k] = left_list[i]
i += 1
else:
num_list[k] = right_list[j]
j += 1
k += 1
while (i < len(left_list)):
num_list[k] = left_list[i]
i += 1
k += 1
while (j < len(right_list)):
num_list[k] = right_list[j]
j += 1
k += 1
return(num_list)
๐์๊ฐ๋ณต์ก๋
๋ณํฉ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๋ $O(n log(n))$์ด๋ค. ์ฐ์ , ์ ์ฒด ๋ฐฐ์ด์ ์ชผ๊ฐค ์ ์์ ๋๊น์ง ๊ณ์ ๋ถํ ํ๋ ๊ณผ์ ๊น์ง $log(n)$๋ฒ์ ํจ์๊ฐ ํธ์ถ๋๋ค. (์ฆ, merge_sort()
ํจ์๊ฐ ํธ์ถ๋๋ ๊ฒ์ด $lon(n)$๋ฒ์ด๋ค.)
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ 2๊ฐ์ ๋ฆฌ์คํธ๋ก ๋ถํ ๋ ๋จ๊ณ์์ ๋ณํฉ์ ํ ๋, ์กฐ๊ฑด ๋น๊ต๋ฅผ ํ๋ฉฐ while๋ฌธ์ ์ด $n$๋ฒ ๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ณํฉ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๋ $O(n log(n))$์ผ๋ก ์ ์ํ ์ ์๋ค.
๋ฐ์ํ
๋๊ธ