알고리즘 with 자바

준비중..

알고리즘 with 자바

문제 해결을 위한 개발자의 필수 소양!

08 병합 정렬(merge sort)

# 병합 정렬 ## 목차 --- 1. 무엇? 2. 특징? 3. 알고리즘 ## 1. 무엇? --- 분할 정복 기법 알고리즘의 하나. 1. 리스트의 길이가 1이하는 정렬된 것. 그렇지 않다면 2. 분할(divide) - 정렬되지 않은 리스트를, 절반으로 나눔 3. 정복(conquer) - 각 부분 리스트를, 재귀적으로 병합 정렬 4. 결합(combine) - 두 부분 리스트를, 하나의 정렬된 리스트로 만듬 5. 복사(copy) - 임시 리스트에 정렬 결과를 원래 리스트에 복사 ## 2. 특징? --- - 빠름, 시간 복잡도 O(nlogn) - 안정 정렬(같은 값의 원소 순서 유지 O) - 추가 메모리 필요, 공간 복잡도 O(n) ## 3. 알고리즘 --- ![클라우드스터딩-자바-병합-정렬](https://i.imgur.com/BCl11Lc.gif) ### 소스코드 ``` mergeSort(A[ ], start, end) { if (start < end) then { // 정렬할 부분의 크기가 1 이하이면, 그냥 리턴한다. middle ← (start + end)/2; // (1) start, end의 중간 지점 계산 mergeSort(A, start, middle); // (2) 중간 지점을 기준으로 앞부분 정렬 mergeSort(A, middle+1, end); // (3) 중간 지점을 기준으로 뒷부분 정렬 merge(A, start, middle, end); // (4) 병합 } } merge(A[ ], start, middle, end) { 정렬되어 있는 두 배열 A[start ... middle]와 A[middle+1 ... end]을 합하여 정렬된 하나의 배열 A[start ... end]을 만든다. } ```