mergeSort
Merge Sort
๋ณํฉ ์ ๋ ฌ(Merge Sort)
: ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๊ฐ ํ๋ ๋ฐ์ ๋จ์ง ์์ ๋๊น์ง ๊ณ์ ๋๋ก ์ชผ๊ฐ ํ์ ๋ค์ ํฌ๊ธฐ ์์ผ๋ก ์ฌ๋ฐฐ์ด ํ๋ฉด์ ์๋ ํฌ๊ธฐ์ ๋ฐฐ์ด๋ก ํฉ์น๋ค
๋ณํฉ ์ ๋ ฌ์ ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ๊ณผ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด๋ค
๊ณต๊ฐ ๋ณต์ก๋๋ O(N)
๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌ๋ฆฌ ์ธ์ ํ ๊ฐ๋ค ๊ฐ์ ์ํธ ์๋ฆฌ ๊ต๋(swap)์ด ์ผ์ด๋์ง ์๋๋ค
์ ๋ ฌ ๋ฐฉ๋ฒ
๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ณธ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ 1. ๋ถํ (divide) : ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ์๋ผ ๋น์ทํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค. 2. ์ ๋ณต(conquer) : ๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ๋ณ ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌํ๋ค. 3. ๊ฒฐํฉ(combine) : ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณํ๋ค. ์ด๋ ์ ๋ ฌ ๊ฒฐ๊ณผ๊ฐ ์์๋ฐฐ์ด์ ์ ์ฅ๋๋ค. 4. ๋ณต์ฌ(copy) : ์์ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค.

public class MergeSort {
private static void sort(int[] arr, int low, int high) {
if (high - low < 2) {
return;
}
int mid = (low + high)/2;
sort(arr, 0, mid);
sort(arr, mid, high);
merge(arr, low, mid, high);
}
private static void merge(int[] arr, int low, int mid, int high) {
int[] temp = new int[high - low];
int t = 0;
int l = low;
int m = mid;
while(l < mid && m < high) {
if (arr[l] < arr[m]) {
temp[t++] = arr[l++];
} else {
temp[t++] = arr[m++];
}
}
while (l < mid) {
temp[t++] = arr[l++];
}
while (m < high) {
temp[t++] = arr[m++];
}
for (int i = low; i < high; i++) {
arr[i] = temp[i - low];
}
}
public static void main(String[] args) {
int[] x = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
sort(x, 0, x.length);
for (int i = 0; i < x.length; i++)
System.out.println("x[" + i + "]๏ผ" + x[i]);
}
}
Last updated
Was this helpful?