일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- kube-prometheus-stack
- Intellij
- esbuild
- apollo router
- goland
- 배포 파이프라인
- elasticsearch
- go
- body size
- cosine similarity metric
- Logrus
- intellij ide
- 사설 ip
- 배포 프로세스
- http 413
- GoF
- typescript
- 티스토리챌린지
- Buffered channel
- gitops
- AWS
- m4 pro
- 오블완
- UnBuffered channel
- 디자인패턴
- javascript
- 코사인 유사성 메트릭스
- Kubernetes
- golang
- Infra
Archives
- Today
- Total
Fall in IT.
기본 정렬 알고리즘 - 병합정렬(Merge Sort) 본문
반응형
기본적인 정렬 알고리즘에는 삽입, 선택, 버블, 퀵, 병합정렬 등이 있습니다.
이 중에서 병합정렬에 대해서 알아보도록 하겠습니다.
병합정렬(Merge Sort)의 특징
-
병합정렬의 핵심 아이디어는 "일단 반으로 나누고 나중에 합쳐서 정렬한다." 입니다.
-
시간 복잡도 O(N * log N)
-
퀵 정렬과 다르게 최악의 경우에도 O(N * logN)을 보장합니다.
코드
/**
* 병합정렬의 핵심 아이디어,
* `일단 반으로 나누고 나중에 합쳐서 정렬한다.`
*
* 퀵정렬과 다르게 항상 속도는 O(N * logN)이 된다.
* 퀵정렬과 동일하게 분할정복법과 재귀함수를 사용한다.
*/
function solution(arr)
{
let sortedArr = [];
mergeSort(arr, 0, arr.length - 1, sortedArr);
return arr;
}
/**
* 나뉘어진 함수를 합치는 함수
*
* @param {*} arr 배열
* @param {*} m 배열 시작점
* @param {*} middle 배열 중간점
* @param {*} n 배열 끝점
*/
function merge(arr, m, middle, n, sortedArr)
{
let i = m; // 쪼갠 배열의 왼쪽 배열의 시작점
let j = middle + 1; // 쪼갠 배열의 오른쪽 배열의 시작점
let k = m; // 정렬된 배열의 시작점
// 작은 순서대로 배열에 삽입
while (i <= middle && j <= n)
{
if (arr[i] <= arr[j])
{
sortedArr[k] = arr[i];
i++;
}
else
{
sortedArr[k] = arr[j];
j++;
}
k++;
}
// i 또는 j가 먼저 끝났을 경우 남은 데이터 삽입
if (i > middle)
{
for (let t = j; t <= n; t++)
{
sortedArr[k] = arr[t];
k++;
}
}
else
{
for (let t = i; t <= middle; t++)
{
sortedArr[k] = arr[t];
k++;
}
}
// 정렬된 배열을 삽입
for (let t = m; t <= n; t++)
arr[t] = sortedArr[t];
}
/**
* 반으로 나누는 함수
*
* @param {*} arr 배열
* @param {*} m 배열 시작점
* @param {*} n 배열 끝점
*/
function mergeSort(arr, m, n, sortedArr)
{
// 크기가 1보다 큰 경우만 처리
if (m < n)
{
let middle = parseInt((m + n) / 2);
mergeSort(arr, m, middle, sortedArr);
mergeSort(arr, middle + 1, n, sortedArr);
merge(arr, m, middle, n, sortedArr);
}
}
console.log(solution([7, 6, 5, 8, 3, 5, 9, 1]));
console.log(solution([1, 9, 2, 7, 3]));
console.log(solution([1, 10, 5, 8, 7, 6, 4, 2, 3, 9]));
console.log(solution([5, 2, 3, 4, 1]));
console.log(solution([5, 2, 3, 1, 4]));
참조
https://www.youtube.com/watch?v=ctkuGoJPmAE&list=PLRx0vPvlEmdDHxCvAQS1_6XV4deOwfVrz&index=8
반응형
'Algorithm' 카테고리의 다른 글
프로그래머스 코딩테스트 [스택/큐] - 탑 (0) | 2019.11.29 |
---|---|
기본 정렬 알고리즘 - 힙정렬(Heap Sort) (0) | 2019.11.29 |
프로그래머스 코딩테스트 [2018 KAKAO BLIND RECRUITMENT] (0) | 2019.11.25 |
프로그래머스 코딩테스트 [2019 KAKAO BLIND RECRUITMENT] - Javascript (0) | 2019.11.20 |
프로그래머스 코딩테스트 [2019 KAKAO BLIND RECRUITMENT] - Javascript (0) | 2019.11.20 |
Comments