반응형
병합 정렬
- 분할 정복 알고리즘으로 정렬하려는 배열을 균등하게 분할하여 정렬
동작
- 정렬할 배열을 균등하게 분할하고
- 분할된 부분 배열을 정렬하고
- 두 개의 정렬된 부분 배열을 병합하여 전체를 정렬
- 예시 : 애니메이션
- 예시 : 전체 과정 예시
- 예시 : 추가 배열이 필요한 이유 (마지막 정복 결합을 예시로)
구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// 정렬과 병합하는 함수
void merge(int list[], int left, int mid, int right){
// i : 정렬된 왼쪽 배열의 인덱스
// j : 정렬된 오른쪽 배열의 인데스
// k : 새롭게 정렬할 배열의 인덱스
int i, j, k, t;
i = left;
j = mid+1;
k = left;
// 왼쪽과 오른쪽 배열의 요소를 비교하면서 새로운 배열에 저장
while(i<=mid && j<=right){
if(list[i]<=list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
// 왼쪽 배열은 끝났지만 오른쪽 배열은 남아 있을 때
// 오른쪽 배열의 나머지를 새로운 배열에 저장
if(i>mid){
for(t=j; t<=right; t++)
sorted[k++] = list[t];
}
// 오른쪽 배열은 끝났지만 왼쪽 배열은 남아 있을 때
// 왼쪽 배열의 나머지를 새로운 배열에 저장
else{
for(t=i; t<=mid; t++)
sorted[k++] = list[t];
}
// 새로운 배열에 저장되었던 값을 원래 배열에 옮기기
for(t=left; t<=right; t++){
list[l] = sorted[l];
}
}
// 합병 정렬
void merge_sort(int list[], int left, int right){
int mid;
if(left<right){
// 균등하게 나누기 위해 가운데 값 구함
mid = (left+right)/2
// 가운데를 기준으로 왼쪽 배열을 다시 나누기
merge_sort(list, left, mid);
// 가운데를 기준으로 오른쪽 배열 다시 나누기
merge_sort(list, mid+1, right);
// 2개의 정렬된 부분 배열을 정렬하고 합치기
merge(list, left, mid, right);
}
}
|
cs |
특징
- 안정 정렬
- 데이터의 분포에 상관 없이 시간복잡도 O(N * logN)
* 균등한 크기로 부분 배열을 나누기 때문
- 시간 복잡도 : O(N * logN)
- 배열을 저장할 추가 배열 필요
참고
- 블로그 1
- 블로그 2
- 블로그 3
- 위키피디아 1
반응형
'Software Courses > Data Structure' 카테고리의 다른 글
Heap sort (힙 정렬) (0) | 2020.12.24 |
---|---|
Quick sort (퀵 정렬) (0) | 2020.12.24 |
Bubble sort (버블 정렬) (0) | 2020.12.23 |
Shell sort (쉘 정렬) (0) | 2020.12.23 |
Insertion sort (삽입 정렬) (0) | 2020.12.22 |