public class MergeSort {
public static void mergeSort(int[] arr) {
if (arr.length <= 1) return;
int mid = arr.length / 2;
int[] left = new int[mid];
int[] right = new int[arr.length - mid];
// ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ธฐ
for (int i = 0; i < mid; i++) {
left[i] = arr[i];
}
for (int i = mid; i < arr.length; i++) {
right[i - mid] = arr[i];
}
// ์ฌ๊ท์ ์ผ๋ก ๊ฐ ๋ถ๋ถ ์ ๋ ฌ
mergeSort(left);
mergeSort(right);
// ์ ๋ ฌ๋ ๋ ๋ถ๋ถ์ ๋ณํฉ
merge(arr, left, right);
}
private static void merge(int[] arr, int[] left, int[] right) {
int i = 0, j = 0, k = 0;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
while (i < left.length) {
arr[k++] = left[i++];
}
while (j < right.length) {
arr[k++] = right[j++];
}
}
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
System.out.println("์ ๋ ฌ ์ ๋ฐฐ์ด:");
for (int num : arr) System.out.print(num + " ");
System.out.println();
mergeSort(arr);
System.out.println("์ ๋ ฌ ํ ๋ฐฐ์ด:");
for (int num : arr) System.out.print(num + " ");
System.out.println();
}
}
Java
๋ณต์ฌ
์๊ฐ๋ณต์ก๋ ๋ถ์
๋ณํฉ ์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋๋ O(n log n)์
๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ถ์์ ํตํด ๋์ถ๋ฉ๋๋ค:
โข
๋ถํ ๊ณผ์ : ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ ๊ณผ์ ์ด log n๋ฒ ๋ฐ์
โข
๋ณํฉ ๊ณผ์ : ๊ฐ ๋ ๋ฒจ์์ n๊ฐ์ ์์๋ฅผ ๋ณํฉํ๋ ๋ฐ O(n)์ ์๊ฐ์ด ์์
๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O(n) ร O(log n) = O(n log n)์ด ๋ฉ๋๋ค.
๋ถํ ๊ณผ์
๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ ๊ณผ์ ์ด log n๋ฒ ๋ฐ์ํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1.
์ฒซ ๋ฒ์งธ ๋ถํ : nํฌ๊ธฐ์ ๋ฐฐ์ด์ n/2 ํฌ๊ธฐ๋ก ๋๋
2.
๋ ๋ฒ์งธ ๋ถํ : n/2 ํฌ๊ธฐ์ ๋ฐฐ์ด๋ค์ n/4 ํฌ๊ธฐ๋ก ๋๋
3.
์ธ ๋ฒ์งธ ๋ถํ : n/4 ํฌ๊ธฐ์ ๋ฐฐ์ด๋ค์ n/8 ํฌ๊ธฐ๋ก ๋๋
4.
์ด๋ฐ ์์ผ๋ก ๊ณ์ ์งํ๋์ด ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 1์ด ๋ ๋๊น์ง ๋ถํ
์ด์ฒ๋ผ ๋งค ๋จ๊ณ๋ง๋ค ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, n์์ 1๊น์ง ๋๋ฌํ๋๋ฐ ํ์ํ ๋ถํ ํ์๋ logโn์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํฌ๊ธฐ๊ฐ 8์ธ ๋ฐฐ์ด์ 8 โ 4 โ 2 โ 1๋ก 3๋ฒ(logโ8 = 3)์ ๋ถํ ์ด ํ์ํฉ๋๋ค.
logโn์ด ๋๋ ์ด์ ๋ฅผ ์ํ์ ์ผ๋ก ์ฆ๋ช
ํด๋ณด๋ฉด:
1.
ํฌ๊ธฐ n์ธ ๋ฐฐ์ด์ด ์์ ๋, ๊ฐ ๋จ๊ณ๋ง๋ค 2๋ก ๋๋์ด์ง๋๋ค.
2.
k๋ฒ ๋๋์์ ๋์ ํฌ๊ธฐ๋ฅผ ํํํ๋ฉด: n/2^k
3.
๋ง์ง๋ง์๋ ํฌ๊ธฐ๊ฐ 1์ด ๋์ด์ผ ํ๋ฏ๋ก:
n/2^k = 1
4.
์๋ณ์ 2^k๋ฅผ ๊ณฑํ๋ฉด:
n = 2^k
5.
์๋ณ์ logโ๋ฅผ ์ทจํ๋ฉด:
logโn = k
๋ฐ๋ผ์ ๋ฐฐ์ด์ด ํฌ๊ธฐ 1์ด ๋ ๋๊น์ง ํ์ํ ๋ถํ ํ์ k๋ logโn์ด ๋ฉ๋๋ค.
logโn์์ log n์ผ๋ก ํ๊ธฐ๊ฐ ์ ๋ฆฌ๋๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1.
๋น
์ค ํ๊ธฐ๋ฒ์์๋ ์์๋ฅผ ์๋ตํฉ๋๋ค.
2.
๋ก๊ทธ์ ๋ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ ๋ณํ ๋ฒ์น์ด ์ ์ฉ๋ฉ๋๋ค:
log_a(n) = log_b(n) / log_b(a)
์๋ฅผ ๋ค์ด, logโn = ln(n) / ln(2) โ 1.443 ร ln(n)
1.
๋ฐ๋ผ์ logโn = c ร log n (c๋ ์์) ํํ๋ก ํํํ ์ ์๊ณ , ๋น
์ค ํ๊ธฐ๋ฒ์์๋ ์์ c๋ฅผ ์๋ตํ์ฌ O(log n)์ผ๋ก ํ๊ธฐํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์๊ณ ๋ฆฌ์ฆ ๋ถ์์์๋ ๋ก๊ทธ์ ๋ฐ์ ๋ช
์ํ์ง ์๊ณ ๋จ์ํ log n์ผ๋ก ํ๊ธฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
๋ณํฉ ๊ณผ์
๋ณํฉ ๊ณผ์ ์์ O(n)์ ์๊ฐ์ด ์์๋๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1.
๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ณํฉํ ๋, ๊ฐ ์์๋ฅผ ํ ๋ฒ์ฉ ๋น๊ตํ๊ณ ์ ๋ฐฐ์ด์ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
2.
์ผ์ชฝ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋น๊ตํ๋ฉด์, ๋ ์์ ๊ฐ์ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ฃ์ต๋๋ค.
3.
์ด ๊ณผ์ ์์ ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ฉ ํ์ธํ๊ณ ์ด๋์์ผ์ผ ํ๋ฏ๋ก, n๊ฐ์ ์์์ ๋ํด O(n)์ ์๊ฐ์ด ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํฌ๊ธฐ๊ฐ 8์ธ ๋ฐฐ์ด์ ๋ณํฉํ ๋:
โข
4๊ฐ์ฉ ๋๋ ๋ ๋ถ๋ถ ๋ฐฐ์ด์ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ๋น๊ต
โข
๊ฐ ๋น๊ต ํ ๋ ์์ ์์๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ณต์ฌ
โข
์ต์
์ ๊ฒฝ์ฐ, 8๊ฐ์ ์์ ๋ชจ๋๋ฅผ ํ ๋ฒ์ฉ ๋น๊ตํ๊ณ ์ด๋์์ผ์ผ ํจ
์ด๋ฌํ ์์
์ด ์ ์ฒด ๋ฐฐ์ด์ ํฌ๊ธฐ n์ ๋น๋กํ์ฌ ์ฆ๊ฐํ๋ฏ๋ก, ๋ณํฉ ๊ณผ์ ์ ์๊ฐ๋ณต์ก๋๋ O(n)์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O(n) ร O(log n) = O(n log n)์ด ๋ฉ๋๋ค.
๊ณต๊ฐ๋ณต์ก๋
๋ณํฉ ์ ๋ ฌ์ ๊ณต๊ฐ๋ณต์ก๋๋ O(n)์
๋๋ค. ์ด๋ ๋ณํฉ ๊ณผ์ ์์ ์๋ณธ ๋ฐฐ์ด๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ์ถ๊ฐ ๋ฐฐ์ด์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
ํน์ง
โข
์์ ์ฑ: ์์ ์ ๋ ฌ
โข
๋ถํ ์ ๋ณต(Divide and Conquer) ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ธ ์์
โข
๋ชจ๋ ๊ฒฝ์ฐ(์ต์ , ํ๊ท , ์ต์
)์ O(n log n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ณด์ฅ
โข
์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ๋ค๋ ๋จ์ ์ด ์์
์๋ ๋ฐฉ์
1.
๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ๋๋
2.
๊ฐ๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ
3.
์ ๋ ฌ๋ ๋ ๋ถ๋ถ ๋ฐฐ์ด์ ํ๋๋ก ๋ณํฉ
์ด ๊ณผ์ ์ ํตํด ์ ์ฒด ๋ฐฐ์ด์ด ์ ๋ ฌ๋ฉ๋๋ค.