본문 바로가기

카테고리 없음

[C/알고리즘] 병합 정렬 Merge Sort

//병합 정렬 알고리즘: mergeSort.c
// 유튜브 참고 영상: "동빈나"의 "8강 - 병합 정렬(Merge Sort) [ 실전 알고리즘 강좌(Algorithm Programming Tutorial) #8 ]"

#include <stdio.h>
#include <stdlib.h>

#define NUM_ARRAY   100

void printArray(int arr[], int length) {
    for (int i = 0; i< length; i++) {
        printf("%d\n", arr[i]);
    }
    printf("\n");
}

int number = NUM_ARRAY;
int sorted[NUM_ARRAY]; //정렬배열은 반드시 전역 변수로...

void merge(int arr[], int start, int mid, int end) {
    int pos1 = start;
    int pos2 = mid + 1;
    int count = start;
    while (pos1 <= mid && pos2 <=end) {
        if (arr[pos1] <= arr[pos2]) {
            sorted[count] = arr[pos1];
            pos1++;
        } else {
            sorted[count] = arr[pos2];
            pos2 ++;
        }
        count++;
    }
    if(pos1 > mid) {
        for(int i = pos2; i <= end; i++) {
            sorted[count] = arr[i];
            count++;
        }
    } else {
        for (int i = pos1; i <= mid; i++) {
            sorted[count] = arr[i];
            count++;
        }
    }
    //정렬된 임시 배열을 원 배열에 삽입
    for (int i = start; i<= end; i++) {
        arr[i] = sorted[i];
     }
}  

void mergeSort(int arr[], int start, int end) {
    // 크기가 1보다 큰 경우
    if (start < end) {
        int mid = (start + end) /2;
        mergeSort(arr, start, mid);
        mergeSort(arr, mid + 1, end);
        merge(arr, start, mid, end);
    }
}

int main() {

    //int array[] = {1, 4, 7, 10, 15, 3, 5, 11, 13, 14, 17, 21}; 
    int array[NUM_ARRAY];
    
    for (int i = 0; i < NUM_ARRAY; i++)
        array[i] = rand();

    const int len = sizeof(array) / sizeof(int);
    int start = 0;
    int end = len -1;
    int mid = (start + end) / 2;

    //printf("%d, %d, %d, %d\n", len, start, mid, end);
    mergeSort(array, start, end);

    printArray(sorted, len);
    return 0;
}
----------------- 실행 결과 ------------
35005211
42999170
84353895
135497281
137806862
149798315
184803526
233665123
.........
1973594324
1984210012
1998898814
2001100545
2038664370
2044897763
2053999932
2084420925
2089018456
2145174067