![[자료구조] 합병 정렬 (merge sort)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHgXV%2FbtrSIRDDFWp%2FaEPE0jRT9muWRUcKFs4bQK%2Fimg.jpg)
합병 정렬이란?
합병 정렬은 리스트를 분할하고 결합하는 과정 속에서 정렬을 수행하고자 하는 방법입니다. 분할-정복에 따른 수행 방식입니다.
앞서 정렬을 할 때는 기존의 리스트를 그대로 이용해서 수행했습니다. 숫자가 적을 때는 시간이 오래 걸리지 않지만, 커지면 시간 복잡도에 따라 수행 시간이 어마하게 늘어남을 알 수 있습니다.
합병 정렬은 기존의 리스트를 쪼개서 더 작은 리스트를 만듭니다(분할). 쪼갤 수 있을 때까지 쪼갭니다(정복) 문제를 충분히 작게 만들었다면, 정렬을 합니다. 이 때 정렬은 숫자 단 두개만을 비교합니다.
정렬을 했다면, 다시 원래 리스트의 크기로 돌아갈 있도록 합쳐줍니다(결합). 합쳐주는 과정에서도 순서대로 숫자가 들어가야 합니다. 따라서 분리되어 있는 리스트의 맨 앞에서 하나씩 꺼내 비교해주면서 넣어줍니다.
합병 정렬 구현
합병 정렬의 핵심은 분할-정복-결합
입니다.
과정은 아래와 같습니다.
- 하나의 리스트를 두 리스트로 분할
- 단, 각각의 리스트를 분할할 수 있다면 1.을 다시 수행
- 분할된 부분 리스트 정렬
- 정렬된 리스트 결합
- 단, 각각의 리스트를 결합할 수 있다면 3.을 다시 수행
코드로 구현하면 아래와 같습니다.
void merge(int list[], lit left, int mid, int right) {
int i = left, j = mid + 1, k = left, l;
while(i <= mid && j <= right) {
if(list[i] <= list[j]) {
sorted[k++] = list[i++];
} else {
sorted[k++] = list[j++];
}
}
if(i > mid) {
for(l = j; l <= right; l++) {
sorted[k++] = list[l];
}
} else {
for(l = i; l <= mid; l++) {
sorted[k++] = list[l];
}
}
for(l = left; l <= right; l++) {
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);
merge(list, left, mid, right);
}
}
합병 정렬의 시간 복잡도
합병 정렬은 최악, 최선, 평균 모두 $O(n \space log \space n)$에 수행됩니다.
[자료구조] 선택 정렬 (selection sort)
선택 정렬이란? 정렬이 되어 있는 왼쪽 리스트와 정렬이 되어 있지 않은 오른쪽 리스트로 나누었다고 가정해봅시다. 오른쪽 리스트에서 가장 작은 숫자를 선택해서 왼쪽 리스트에 차례대로 넣
laurent.tistory.com
[자료구조] 삽입 정렬 (insertion sort)
삽입 정렬이란? 정렬이 되어 있는 왼쪽 리스트와 정렬이 되어 있지 않은 오른쪽 리스트로 나누었다고 가정해봅시다. 배열의 첫 원소부터 차례대로 앞에 이미 정렬되어 있는 왼쪽 리스트와 비교
laurent.tistory.com
[자료구조] 버블 정렬 (bubble sort)
버블 정렬이란? 버블 정렬은 두 개의 인접한 원소를 비교해 순서에 맞지 않으면 서로 교환하는 정렬 방식입니다. 이렇게 인접한 원소를 교환하는 모습이 마치 물 속의 거품과 비슷해 버블 정렬
laurent.tistory.com
[자료구조] 셸 정렬 (shell sort)
셸 정렬이란? 이전에 포스팅 했던 삽입 정렬은 시간 복잡도가 $O(n^2)$로 정렬 알고리즘 중에서는 느린 축에 속하는 정렬 방식이었습니다. 하지만 삽입 정렬은 어느 정도 배열이 정렬이 된 상태라
laurent.tistory.com
[자료구조] 퀵 정렬 (quick sort)
퀵 정렬이란? 퀵 정렬은 합병 정렬과 동일하게 분할 정복 알고리즘을 사용합니다. 차이점이 존재한다면, 퀵 정렬은 리스트를 비균등하게 분할합니다. 작동 방식 작동 방식에 앞서, 퀵 정렬에는
laurent.tistory.com
[자료구조] 힙 정렬 (heap sort)
힙 정렬이란? 힙 정렬은 힙 트리를 이용해 정렬을 하는 것을 말합니다. 사실 최대 힙과 최소 힙은 각각 루트에 최댓값과 최솟값이 이미 있습니다. 루트를 계속 꺼내면 힙의 정의에 의해 그 다음
laurent.tistory.com
[자료구조] 기수 정렬 (radix sort)
기수 정렬이란? 처음 이 정렬을 들으면 기수라는 단어가 생소할 겁니다. 사전에서 찾아보면 다음과 같습니다. 십진수에서는 0부터 9까지의 숫자를 각 자릿수에 넣을 수 있습니다. 우리는 이 리스
laurent.tistory.com
'CSE > 자료구조 (data structure)' 카테고리의 다른 글
[자료구조] 힙 정렬 (heap sort) (0) | 2022.11.15 |
---|---|
[자료구조] 퀵 정렬 (quick sort) (0) | 2022.11.14 |
[자료구조] 셸 정렬 (shell sort) (0) | 2022.11.12 |
[자료구조] 버블 정렬 (bubble sort) (0) | 2022.11.11 |
[자료구조] 삽입 정렬 (insertion sort) (0) | 2022.11.10 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!