기타등등/알고리즘 기록

[C++] 병합정렬

CodeJB 2021. 8. 4. 19:57

#include <iostream>
int data[10], tmp[10];

void divide(int lt, int rt){
    int mid;
    int p1, p2, p3;
    if(lt < rt)
    {
        //나누기
        mid = (lt+rt)/2;
        divide(lt, mid);
        divide(mid+1,rt);
        
        //합치기
        p1 = lt;
        p2 = mid+1;
        p3 = lt;
        while(p1 <= mid && p2 <= rt){
            if(data[p1] < data[p2]) tmp [p3++] = data[p1++];
            else tmp [p3++] = data[p2++];
        }
        
        //나머지 쓸어담기
        while(p1 <= mid) tmp[p3++] = data[p1++];
        while(p2 <= rt) tmp[p3++] = data[p2++];
        
        //원데이터 바꾸기
        for(int i = lt; i <= rt; i++){
            data[i] = tmp[i];
        }
        
    }
}

int main() {
    int n, i;
    scanf("%d", &n);
    for(i = 1; i <= n; i++){
        scanf("%d", &data[i]);
    }
    
    //lt rt넘기기 == 정렬 범위
    divide(1,n);
    for(i = 1; i <= n; i++){
        printf("%d ", data[i]);
    }
    return 0;
}
  • 재귀적으로 배열을 분할하고
  • 투포인터 알고리즘으로 배열을 정렬 및 합친다.
  • 배열을 실제로 나눈다고 생각하면 헷갈린다.
  • data배열이 나뉘어지는게 아니라 DFS트리를 만들고 투포인터 알고리즘의 포인터가 해당 함수의 매개변수를 이용하여 data배열을 가리키고 있는 것이다.

https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/dashboard