Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준 1158
- qorwns
- 구현
- 시간 복잡도
- 1764
- 해시 구현
- 버킷 정렬
- c#
- 백준 1406
- 조세퍼스 순열
- C/C++ 구현
- 원판 돌리기
- Stack 이란
- dfs
- 백준 17779
- 백준 2447
- 게리멘더링2
- 별 찍기 10
- 스택의 특징
- ㅣ풀이
- 풀이
- 5397
- heap
- 백준 17822
- 백준 17471
- 해시구현
- AVL 시간 복잡도
- 자료구조
- 백준 5397
- 백준
Archives
- Today
- Total
홍시홍의 프로그래밍
병합(합병) 정렬 (C/C++ 구현, 시간 복잡도) 본문
1. 병합정렬
합병 정렬 또는 병합 정렬(merge sort)은 O(n log n) 비교 기반 정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다. 존 폰 노이만이 1945년에 개발했다.
합병 정렬 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 합병 정렬 또는 병합 정렬(merge sort)은 O(n log n) 비교 기반 정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다. 존 폰 노이만이 1945년에 개발했다.[1] 알고리즘[편집] 합병 정렬은 다음과 같이 작동한다. 리스트의 길이가 0 또는 1이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의
ko.wikipedia.org
출처 - 위키피디아(https://ko.wikipedia.org/wiki/%ED%95%A9%EB%B3%91_%EC%A0%95%EB%A0%AC)
나의 해석 : 반으로 분할 -> 합병(합칠 때 크기 비교)
요구 사항
1. 배열 오름차순으로 구현
풀이 방법
1. 최소 단위까지 분할 - 재귀
2. 합병 할 때 크기 비교하여 임시 배열에 넣음(소스 코드 참조)
3. 임시 배열을 다시 원래 배열로 옮김
시간 복잡도
최소 단위가 될 때까지 분할 log n
합병하면서 비교 n
O(nlogn)
소스 코드
#include <iostream>
using namespace std;
int a[10] = { 5,4,3,2,1 ,457,5412,879456,45120,6523};
//합치기
void m_sort(int list[], int l, int m, int r)
{
int i, j, k;
i = l;
j = m + 1;
k = l;
int temp[11];
//왼쪽에서 정렬된 배열과 오른쪽에서 정렬된 배열을 합침
//둘중 하나가 끝까지 올때 까지 합침
while (i <= m && j <= r)
{
if (list[i] <= list[j])
temp[k++] = list[i++];
else
temp[k++] = list[j++];
}
//오른쪽 배열에 임시 배열로 추가할 수가 남았으면 오른쪽 배열을 임시 배열로 복사
if (i > m)
{
for (int x = j; x <= r; x++)
temp[k++] = list[x];
}
//왼쪽 배열에 임시 배열로 추가할 수가 남았으면 왼쪽 배열을 임시 배열로 복사
else
{
for (int x = i; x <= m; x++)
temp[k++] = list[x];
}
//본 배열으로 복귀
for (int x = l; x <= r; x++)
list[x] = temp[x];
}
void merge(int list[], int l, int r)
{
int mid;
if (l < r)
{
mid = (l + r) / 2;
merge(list, l, mid);
merge(list, mid + 1, r);
m_sort(list, l, mid, r);
}
}
int main()
{
merge(a,0,9);
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
return 0;
}
'알고리즘' 카테고리의 다른 글
기수(radix) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.23 |
---|---|
퀵(quick) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.18 |
계수(Counting) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.18 |
버블 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
삽입 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
Comments