컴퓨터/Algorithm
병합 정렬(Merge Sort)
빵케잌
2019. 11. 17. 14:20
(참고) 폰 노이만이 고안
QSort, MSort 둘 다 Divide & Conquer 철학에서 나온 것
머지소트는 많은 자료를 한번 정렬하는 것보다 적은 자료를 여러 번 정렬하겠다는 철학에서 나옴
|
Q |
M |
전략 |
Pivot 기준 절반 |
무조건 절반 |
Avg |
O(nlogn) |
O(nlogn) |
Worst |
O(n2) |
O(nlogn) |
공간 |
자료 공간 |
자료 공간 * 2 |
1. 영역 나누기
2. 각 영역 재귀적 진행
3. 두 개의 영역 Merge
-Merge 과정
(S,m) (m+1,e) 두개의 영역을 -> (S,e) 배열로 넣는다.
Idx1, idx2를 이용해 우선순위인 것을 먼저 넣어주고 그 쪽 인덱스를 ++
한쪽이 끝나면 나머지를 전부다 넣어준다.
<Code>
void msort(int s, int e)
{
int l, r, t, m, i;
if (s >= e)return;
l = t = s;
m = (s + e) / 2;
r = m + 1;
msort(s, m);
msort(r, e);
while (l <= m && r <= e)tmp[t++] = (a[l] > a[r]) ? a[r++] : a[l++];
while (l <= m)tmp[t++] = a[l++];
while (r <= e)tmp[t++] = a[r++];
for (i = s; i <= e; i++)a[i] = tmp[i];
}