μ λ ¬μ ν μ μλ λ°©λ²μ μ¬λ¬κ°μ§κ° μλ€.
λνμ μΌλ‘ λ€μκ³Ό κ°μ λ°©λ²μ΄ μλ€.
π‘ μ λ ¬μ μ’ λ₯μ λ°©μ
1. λ²λΈ μ λ ¬ : 2κ°μ μμλ₯Ό κ³μ λΉκ΅ν΄λκ°λ©° κ°μ΄ ν° μμκ° μμ μλ κ²½μ° μμΉλ₯Ό κ΅ννλ€. μ μΌ ν° κ°(μ€λ¦μ°¨μμ κ²½μ°)μ μ μΌ λ€λ‘ 보λ΄μ΄ μ΅μ’ μ μΌλ‘ μ λ ¬λλ€. μκ° λ³΅μ‘λλ O(N^2)μΌλ‘ λ³Ό μ μλ€. λ§μ½ νλ² μννμ λ λ μμκ° μμΉκ° λ³ν μ μ΄ μλ€λ©΄ μνλ₯Ό λΉ μ Έλκ°λ λ°©μμΌλ‘ μ΅μ νλ₯Ό ν μ μλ€.
2. μ ν μ λ ¬ : μμλ€μ μννμ¬ κ°μ₯ μμ κ°μ μ°Ύμ λ€(μ ν), μ μΌ μ μμμ μμΉλ₯Ό λ°κΏμΌλ‘μ μμ κ°μ΄ κ³μ μμΌλ‘ μ΄λνλ©΄μ μ΅μ’ μ μΌλ‘ μ λ ¬λλ€. μκ° λ³΅μ‘λλ O(N^2)μΌλ‘ λ³Ό μ μλ€.
3. μ½μ μ λ ¬ : 2λ²μ§Έ μμλΆν° μμν΄μ Nλ²μ§Έ μμκΉμ§ N-1κΉμ§μ μ λ ¬λ λ°°μ΄μ μ λ ¬μ μ μ§ν μ μλ μμΉλ₯Ό μ°Ύμ μ½μ νλ μ λ ¬μ΄λ€. μκ° λ³΅μ‘λλ O(N^2)μ΄κ³ , μ΄λ―Έ μ΄λμ λ μ λ ¬λμ΄μμλ ν¨μ¨μ μΌλ‘ λμν μ μλ€.
μ λ°©μμ μ΅λ μκ° λ³΅μ‘λκ° O(N^2)μ΄ λλ€.
νμ§λ§, λ³λ ¬ μ λ ¬μ μ¬μ©νλ©΄ O(NlogN) μκ° λ³΅μ‘λλ‘ μ λ ¬μ μνν μ μλ€.
μ΄ μμκ° Nκ°μΈ λ°°μ΄μ λ°λ³΅μ μΌλ‘ λΆν νμ¬ μ΅λν μκ² μͺΌκ° λ€μμ, μΈμ ν μμλ€λΌλ¦¬ λΉκ΅νμ¬ μ λ ¬νλ λ°©μμ΄λ€.
μͺΌκ°μ§ μ‘°κ°λ€μ ν©μΉ λ, μ λ ¬ν΄μ ν©μΉ¨μΌλ‘μ μ΅μ’ μ μΌλ‘ μ λ ¬λλ€.
ꡬν
1. λΆν μμ
2. λΆν λ μμλ€μ μ λ ¬νμ¬ ν©μΉλ μμ
μ λκ°μ§ μμ μΌλ‘ λΆλ¦¬ν΄μ μκ°νλ©΄ μ½λ€.
λΆν μμ
private static void mergeSort(int[] arr, int left, int right) {
if (right - left <= 1) {
return;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid, right);
merge(arr, left, mid, right);
}
λΆν ν μ μμ λκΉμ§ λΆν νκ³ merge λ©μλλ₯Ό νΈμΆνλ€.
merge λ©μλλ λΆν λ λ λ°°μ΄μ μ λ ¬νμ¬ ν©μΉλ λ©μλμ΄λ€.
λ³ν© μμ
private static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left];
int idx = 0, l = left, r = mid;
while (l < mid && r < right) {
if (arr[l] < arr[r]) {
temp[idx++] = arr[l++];
} else {
temp[idx++] = arr[r++];
}
}
while (l < mid) {
temp[idx++] = arr[l++];
}
while (r < right) {
temp[idx++] = arr[r++];
}
for (int i = left; i < right; i++) {
arr[i] = temp[i - left];
}
}
μμ λ°°μ΄μ μ΄κΈ°ννκ³ , 첫λ²μ§Έ 쑰건문μΌλ‘ λ λ°°μ΄μ μμ ν¬κΈ°μ λ°λΌ μμ λ°°μ΄μ μ λ ₯νκ³
λ―Έμ² μ λ ₯λμ§ λͺ»ν μμλ€κΉμ§ μμλλ‘ μ λ ₯ν΄μ€λ€.
κ·Έλ¦¬κ³ , μ€μ λ°°μ΄ arrμ λ°μμμΌμ£Όλ©΄ λλ€.
κ²°κ³Ό νμΈ
import java.util.Arrays;
import java.util.Random;
public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[30];
Random rand = new Random();
for (int i = 0; i < 30; i++) {
arr[i] = rand.nextInt(100);
}
System.out.println(Arrays.toString(arr));
mergeSort(arr, 0, arr.length);
System.out.println(Arrays.toString(arr));
}
private static void mergeSort(int[] arr, int left, int right) {
if (right - left <= 1) {
return;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid, right);
merge(arr, left, mid, right);
}
private static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left];
int idx = 0, l = left, r = mid;
while (l < mid && r < right) {
if (arr[l] < arr[r]) {
temp[idx++] = arr[l++];
} else {
temp[idx++] = arr[r++];
}
}
while (l < mid) {
temp[idx++] = arr[l++];
}
while (r < right) {
temp[idx++] = arr[r++];
}
for (int i = left; i < right; i++) {
arr[i] = temp[i - left];
}
}
}
μ μ½λλ₯Ό μ€νν΄λ³΄λ μλμ κ°μ΄ μ μ λ ¬λ¨μ νμΈν μ μμλ€.
κ°νΉ, O(NlogN) μκ°λ³΅μ‘λλ‘ μ λ ¬μ μνν νμκ° μμ λ μ¬μ©ν μ μλλ‘ κΌ κΈ°μ΅νκ³ μμ΄μΌκ² λ€.