티스토리 뷰

자료구조와 알고리즘

머지 소트

Stolen Moments 2019. 3. 29. 01:12

분할 정복


배열을 하나 또는 둘 까지 반으로 계속 쪼갠 다음 합치는 방식으로 이해하면 됨



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int arr[100000]; // 입력받은 배열
int tmp[100000]; // 정렬에 필요한 임시 배열
void merge(int a, int b) {
    if (b == a) return;
    if (b - a == 1) {
        if (arr[a] > arr[b]) swap(arr[a], arr[b]);
        return;
    }
    int left = a;
    int mid = (a + b) / 2;
    int right = mid + 1;
    merge(a, mid);
    merge(mid + 1, b);
    int i = a;
    while (left != mid + 1 && right != b + 1) {
        if (arr[left] < arr[right]) tmp[i++= arr[left++];
        else tmp[i++= arr[right++];
    }
    if (left != mid + 1while (i != b + 1) tmp[i++= arr[left++];
    if (right != b + 1while (i != b + 1) tmp[i++= arr[right++];
    for (int j = a; j <= b; j++) arr[j] = tmp[j];
}
cs


반응형

'자료구조와 알고리즘' 카테고리의 다른 글

벨만-포드 알고리즘  (0) 2019.02.07
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함