728x90
Merge Sort(λ³ν© μ λ ¬)
λ³ν© μ λ ¬μ λΆν μ 볡(Divide and Conquer)μ λνμ μΈ μμ΄λ€. nκ°μ λ°μ΄ν°λ₯Ό κ°μ§ λ°°μ΄μ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νκΈ° μν΄ λ³ν©μ λ ¬μ μ¬μ©νλ€λ©΄ μλμ κ°μ 3λ¨κ³μ κ³Όμ μ κ±°μΉκ² λλ€.
1. Divide(λΆν ) : nκ°μ μμλ₯Ό κ°λ λ°°μ΄μ n/2 κ°μ μμλ₯Ό κ°λ μμλ°°μ΄ 2κ°λ‘ λλλ€.
2. Conquer(μ 볡) : κ°κ°μ μμ λ°°μ΄λ€μ μ λ ¬νλ€.
3. Combine(λ³ν©) : μ λ ¬λ μμ λ°°μ΄λ€μ λ³ν©νλ€.
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μΉκ² λλ€.
λ³ν©μ λ ¬μ νΉμ§
- λ³ν©μ λ ¬μ λΆν ν μμ λ°°μ΄μ μν μ μ₯곡κ°μ΄ λ°λ‘ νμνλ€. nκ°μ μμλ₯Ό n/2 κ°μ© λλλ―λ‘ λ³ν©μ λ ¬μ 곡κ°λ³΅μ‘λλ O(n)μ΄λ€. λ°λΌμ not-in place μ λ ¬μ΄λ€.
- μκ° λ³΅μ‘λλ O(nlogn)μ΄λ€.
- μ½μ μ λ ¬μ μ€λ³΅λ ν€ κ°μ μμκ° μ λ ¬ νμλ μ μ§λλ―λ‘ stable μ λ ¬μ΄λ€.
μμ€μ½λ
void merge(int arr[], int left, int mid, int right) {
int i, j, k, l;
i = left;
j = mid + 1;
k = left;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j])
sorted[k++] = arr[i++];
else
sorted[k++] = arr[j++];
}
if (i > mid) {
for (l = j; l <= right; l++)
sorted[k++] = arr[l];
}
else {
for (l = i; l <= mid; l++)
sorted[k++] = arr[l];
}
for (l = left; l <= right; l++) {
arr[l] = sorted[l];
}
}
void merge_sort(int arr[], int left, int right) {
int mid;
if (left < right) {
mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
728x90