컴퓨터/자료구조
합병정렬
gracelove91
2020. 1. 12. 11:41
합병정렬(merge sort)
분할정복법을 이용한 정렬이다.
분할정복법 ?
분할 : 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할
정복 : 각각의 작은 문제를 순환적으로 해결
합병 : 작은 문제의 해를 합하여(merge) 원래문제에 대한 해를 구함.
- 데이터가 저장된 배열을 절반으로 나눔
- 각각을 순환적으로 정렬
- 정렬된 두 개의 배열을 합쳐 전체를 정
{'A','L','G','O','R','O','T','H','M','S'}
- {'A','L','G','O','R'} , {'O','T','H','M','S'}
- {'A','G','L','O','R'}, {'H','I','M','S','T'}
- {'A','G','H','I','L','M','O','R','S','T'}
{1,2,2,3,4,5,6,7}
{2,4,5,7}
- {2,5}
- {2}. {5}
- {4,7}
- {4}, {7}
- {2,5}
{1,2,3,6}
{1,3}
- {1},{3}
{2,6}
{2},{6}
mergeSort(A[], p, r) -> A[p...r]을 정렬한다. { if(p < r) then { q <- (p+r) / 2 -----> 1. p, r의 중간 지점 계산 mergeSort(A, p, q); -----> 2. 전반부 정렬 mergeSort(A, q+1, r); ----> 3. 후반부 정렬 merge(A, p, q, r); ------> 4. 합병 } }
merge(A[], p, q, r) { 정렬되어있는 두 배열 A[p...q]와 A[q+1...r] 을 합하여 정렬된 하나의 배열 A[p...r]을 만든다. }
void merge(int data[], int p, int q, int r) { int i = p; j = q+1, k=p int temp[data.length()]; while( i<=q && j<=r ) { if(data[i]<=data[j]) temp[k++] = data[i++]; else temp[k++] = data[j++]; }
while(i <= q)
temp[k++] = data[i++];
while(j <= r)
temp[k++] = data[j++];
for(int i = p; i <= r; i++)
data[i] = temp[i];
}