상세 컨텐츠

본문 제목

62. 병합정렬

알고리즘

by 홍루피 2021. 1. 18. 23:04

본문

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

입력예제 1

8

7 6 3 1 5 2 4 8

 

출력예제 1

1 2 3 4 5 6 7 8

 

풀이 

- 왼쪽 끝과 오른쪽 끝을 lt, rt로, 그 둘을 절반한 것을 mid로 놓는다

- lt~mid까지 한 묶음 / mid+1~rt까지 한 묶음이 된다

- data[p1]과 data[p2]를 비교해서 작은 값을 tmp[p3]에 넣는다

- 이 작업을 모두 수행하면 왼쪽 묶음이든 오른쪽 묶음이든 한쪽은 tmp에 모두 들어간다

- 남은 한쪽을 넣어주기 위해 while문을 사용한다

- 모든 작업을 마친후 tmp에 있는 모든 값을 data에 옮겨 준다

- n개 데이터를 각 레벨별로 n번 비교 => nlogn

 

#include <stdio.h>
#include <algorithm>
using namespace std;
int data[10],tmp[10];

//62. 병합 정렬
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]);
    }
    divide(1,n);
    for(i=1;i<=n;i++){
        printf("%d ", data[i]);
    }
    return 0;
}

'알고리즘' 카테고리의 다른 글

64. 경로탐색 [DFS]  (0) 2021.01.20
63. 인접행렬  (0) 2021.01.19
39. 두배열 합치기  (0) 2021.01.15
프로그래머스-타겟 넘버[DFS]  (0) 2021.01.14
61. 특정 수 만들기[DFS]  (0) 2021.01.13

관련글 더보기