Study/자료구조
[자료구조] 정렬 #4 - 합병정렬 (Merge Sort)
_gayeon
2021. 2. 2. 15:52
합병정렬이란?
: devide and conquer(분할 정복) 알고리즘 중 하나
분할 정복 알고리즘: 문제를 작은 두 개의 문제로 분할하고 각각 해결 한 후 결과를 모아서 원래 문제를 해결하는 방법
- devide : 입력 배열을 같은 크기의 두 개의 배열로 분할
- conquer : 부분 배열 정렬
- combine : 정렬된 부분 배열들을 합병
* 레코드를 linked list로 구성하면 index만 변경되어 데이터 이동이 적다.
시간복잡도: O(nlogn)
구현 (오름차순)
void merge(int a[], int left, int mid, int right){
int temp[MAX_SIZE]; //레코드를 배열로 구성하면 임시배열 필요
for(int i=left; i<=right; i++){
temp[i] = a[i];
}
int i = left; // 왼쪽 배열 시작점
int j = mid + 1; // 오른쪽 배열 시작점
int k = left; //정렬될 배열의 index 시작점
while(i<=mid && j<=right){
if(temp[i] <= temp[j])
a[k++] = temp[i++];
else
a[k++] = temp[j++];
}
while(i<=mid)
a[k++] = temp[i++];
while(j<=right)
a[k++] = temp[j++];
}
void mergeSort(int a[], int left, int right) {
if(left == right){
return;
}
int mid = (left + right)/2; //분할(devide)
mergeSort(a, left, mid); // 왼쪽 정렬
mergeSort(a, mid+1, right); // 오른쪽 정렬
merge(a,left, mid, right); // 합병
}
int main(){
v = [1,2,3,4,5,6,7];
mergesort(v,0,7);
return 0;
}
출처