programming/c

합병정렬(merge sort)

chanchand 2023. 1. 14. 18:09
반응형

분할 정복(divide and conquer)

문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략

 

- 분할(Divde) 

입력 배열을 같은 크기의 2개의 부분 배열로 분할

- 정복(Conquer)

부분 배열을 정렬

- 결합(Combine) 

정렬된 부분 배열들을 하나의 배열에 합병

 

#include <stdio.h>
int sorted[8];

void merge(int list[], int left, int mid, int right){
    int i,j,k,l;
    i=left; //왼쪽 배열의 첫 인덱스
    j=mid+1; //오른쪽 배열의 첫 인덱스
    k=left; //임시 배열 인덱스

    // 합병
    while(i<=mid && j<=right){
        if (list[i]<=list[j]){
            sorted[k++]=list[i++];
        }
        else {
            sorted[k++]=list[j++];
        }
    }

    if (i>mid){ // 오른쪽 배열의 남아있는 값
        for (l=j; l<=right; l++){
            sorted[k++]=list[l];
        }
    }
    else { // 왼쪽 배열의 남아있는 값
        for (l=i; l<=mid; l++){
            sorted[k++]=list[l];
        }
    }

    // 임시배열(sorted) 리스트를 배열 list로 복사
    for (l=left; l<=right; l++){
        list[l]=sorted[l];
    }
}

void merge_sort(int list[], int left, int right){
    int mid;

    if (left<right){
        mid=(left+right)/2;
        merge_sort(list, left, mid);
        merge_sort(list, mid+1, right);
        merge(list, left, mid, right);
    }
}



int main(){
    int i;
    int n=8;
    int list[8]={21,10,12,20,25,13,15,22};

    // left : 배열의 시작, right : 배열의 끝
    merge_sort(list, 0, n-1);

    for (i=0; i<n; i++){
        printf("%d\n",list[i]);
    }

    return 0;
}

 

 

참고

https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

 

[알고리즘] 합병 정렬(merge sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

반응형

'programming > c' 카테고리의 다른 글

qsort()  (1) 2023.10.01
[CodeUp] 1079-1092 (ing)  (0) 2023.09.28
배열 길이  (0) 2023.04.17
[BAEKJOON] 알고리즘 수업 - 병합 정렬 1(24060)  (0) 2023.01.14
error: variable-sized object may not be initialized  (0) 2023.01.14