ํ•ฉ๋ณ‘ ์ •๋ ฌ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ถ„ํ• (Divide), ์ •๋ณต(Conquer), ๊ฒฐํ•ฉ(Combine)์ด๋ผ๋Š” ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์š”์†Œ๋“ค์„ ํ•œ ๋ฒˆ์— ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์š”์†Œ๋“ค์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ด๋ฅผ ๋˜ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด์ง€์š”.

์ „์ฒด ๊ณผ์ •์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ฉ๋ณ‘ ์ •๋ ฌ ๊ณผ์ •



ํ•ฉ๋ณ‘ ์ •๋ ฌ ์ง„ํ–‰

์œ„์˜ ์ „์ฒด ์ •๋ ฌ ๊ณผ์ •์„ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์‚ดํŽด๋ด…์‹œ๋‹ค. ์ •๋ ฌ ์š”์†Œ๋“ค์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ์™ผ์ชฝ ์˜์—ญ์„ left, ์˜ค๋ฅธ์ชฝ ์˜์—ญ์„ right๋กœ ํ‘œ๊ธฐํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์‹œ์ž‘๊ณผ ๋์— Start, End๋กœ ํ‘œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ฉ๋ณ‘ ์ •๋ ฌ Step1

"3๊ณผ 1์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„ 1์„ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์— ์ด๋™, rightStart๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค."


ํ•ฉ๋ณ‘ ์ •๋ ฌ Step2

"3๊ณผ 2๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„ 2๋ฅผ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์— ์ด๋™, rightStart๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค."


ํ•ฉ๋ณ‘ ์ •๋ ฌ Step3

"3๊ณผ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„ 3์„ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์— ์ด๋™, leftStart๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค."


ํ•ฉ๋ณ‘ ์ •๋ ฌ Step4

"6๊ณผ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„ 6์„ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์— ์ด๋™, leftStart๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค."


ํ•ฉ๋ณ‘ ์ •๋ ฌ Step5

"9์™€ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„ 7์„ ์ •๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด์— ์ด๋™, rightStart๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค."


๋งˆ์ง€๋ง‰ ๋น„๊ต ๊ณผ์ • ์ดํ›„์— ์˜ค๋ฅธ์ชฝ ์˜์—ญ์˜ ์‹œ์ž‘์ธ rightStart๋Š” ์˜ค๋ฅธ์ชฝ์˜ ๋์ธ rightEnd๋ฅผ ๋„˜์–ด์„œ๋Š” ์œ„์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์ด์ƒ์˜ ์ •๋ ฌ์„ ์œ„ํ•œ ๋น„๊ต๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.


ํ•ฉ๋ณ‘ ์ •๋ ฌ ๊ตฌํ˜„

์œ„ ๊ณผ์ •์„ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ด…์‹œ๋‹ค.

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

void Merge(int arr[], int left, int mid, int right)
{
    int leftStart = left;
    int leftEnd = mid;
    int rightStart = mid + 1;
    int rightEnd = right;
    int index = 0;
 
    // ํ•ฉ๋ณ‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด ๋™์  ํ• ๋‹น
    int* sortedArr = (int*)malloc(sizeof(int)*(right + 1));
    int sortedArrIndex = left;

    while ((leftStart <= leftEnd) && (rightStart <= rightEnd)) {
        if (arr[leftStart] > arr[rightStart]) {
            sortedArr[sortedArrIndex] = arr[rightStart++];
        }
        else { 
            sortedArr[sortedArrIndex] = arr[leftStart++];
        }
        sortedArrIndex++;
    }
    
    // ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„์ด ๋ชจ๋‘ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ์˜ฎ๊ฒจ์กŒ๋‹ค๋ฉด
    if (leftStart > leftEnd) {
        // ๋ฐฐ์—ด์˜ ๋’ท๋ถ€๋ถ„์— ๋‚จ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค.
        for (index = rightStart; index <= rightEnd; index++) {
            sortedArr[sortedArrIndex++] = arr[index];
        }
    }

    // ๋ฐฐ์—ด์˜ ๋’ท๋ถ€๋ถ„์ด ๋ชจ๋‘ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ์˜ฎ๊ฒจ์กŒ๋‹ค๋ฉด
    else {
        // ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„์— ๋‚จ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค.
        for (index = leftStart; index <= leftEnd; index++) {
            sortedArr[sortedArrIndex++] = arr[index];
        }
    }

    for (index = left; index <= right; index++)
        arr[index] = sortedArr[index];

    free(sortedArr);
}

void MergeSort(int arr[], int left, int right)
{
    int mid;

    // left๊ฐ€ ๋” ์ž‘์€ ๊ฒฝ์šฐ๋Š” ๋” ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    if (left < right) {
        // ์ค‘๊ฐ„ ์ง€์  ๊ณ„์‚ฐ
        mid = (left + right) / 2;
        
        // left๋ถ€ํ„ฐ mid๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ
        MergeSort(arr, left, mid);

        // mid+1๋ถ€ํ„ฐ right๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ
        MergeSort(arr, mid + 1, right);

        // ์ •๋ ฌ๋œ ๋‘ ๋ฐฐ์—ด์„ ํ•ฉ๋ณ‘ํ•˜๊ธฐ
        Merge(arr, left, mid, right);
    }
}

int main(void)
{
    int arr[] = { 6, 3, 9, 1, 2, 7 };
    int index = 0;
    int arrSize = (sizeof(arr) / sizeof(int));

    MergeSort(arr, 0, arrSize-1);

    for (index = 0; index < arrSize; index++)
        printf("%d ", arr[index]);
 
    return 0;
}


ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์€?

์œ„ ๊ณผ์ •์—์„œ < 3, 6, 9 >์™€ < 1, 2, 7 >์„ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ํ•ฉ์น  ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.

  • 1) 3๊ณผ 1์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„์— 1์„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • 2) 3๊ณผ 2๋ฅผ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„์— 2๋ฅผ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • 3) 3๊ณผ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„์— 3์„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • 4) 6๊ณผ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„์— 6์„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • 5) 9์™€ 7์„ ๋น„๊ตํ•œ๋‹ค. ๋น„๊ต ์—ฐ์‚ฐ ํ›„์— 7์„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™ํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ์€ < 9 >๋ฅผ ์ •๋ ฌ๋œ ๋ฐฐ์—ด๋กœ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ if - else ๋ฌธ์˜ ๋น„๊ต ์—ฐ์‚ฐ

์ด๋ ‡๊ฒŒ, ํ•˜๋‚˜์˜ ์š”์†Œ๊ฐ€ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋น„๊ต ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ตœ๋Œ€์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜์ธ n์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ •๋ ฌํ•ด์•ผ ํ•  ์š”์†Œ ๊ฐœ์ˆ˜ n๊ณผ ํ•ฉ๋ณ‘ํ•˜๋Š” ๊ณผ์ •์˜ ํšŸ์ˆ˜ k์— ๋Œ€ํ•ด์„œ \(k=\log _{ 2 }{ n }\) ์‹์ด ์„ฑ๋ฆฝ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ๋น„๊ต ์—ฐ์‚ฐ์„ ๋‚˜ํƒ€๋‚ด๋ฉด \(O(n\log _{ 2 }{ n } )\) ์ž…๋‹ˆ๋‹ค.

์ž์„ธํžˆ ๋ณด๋ฉด, ํ•ฉ๋ณ‘ ๊ณผ์ •์—์„œ ์š”์†Œ๋“ค์ด ์ด๋™๋˜๋Š” ์—ฐ์‚ฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋™์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” โ€˜์ž„์‹œ ๋ฐฐ์—ด์— ์š”์†Œ๋“ค์„ ํ•ฉ์น˜๋Š” ๊ณผ์ •โ€™์—์„œ 1ํšŒ ๋ฐœ์ƒํ•˜๊ณ  โ€˜์ž„์‹œ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์š”์†Œ๋“ค ์ „๋ถ€๋ฅผ ์›๋ž˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š” ๊ณผ์ •โ€™์—์„œ 1ํšŒ์”ฉ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์š”์†Œ ์ด๋™์œผ๋กœ ์ธํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” ์ตœ์•…, ํ‰๊ท , ์ตœ์„ ์˜ ๊ฒฝ์šฐ์™€ ์ƒ๊ด€์—†์ด \(2n\log _{ 2 }{ n }\) ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์—์„œ ์ƒ์ˆ˜์ธ 2๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์ข…์ ์ธ ๋น…์˜ค ํ‘œํ˜„์€ \(O(n\log _{ 2 }{ n } )\) ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



ํ•ฉ๋ณ‘ ์ •๋ ฌ๊ณผ ํ€ต ์ •๋ ฌ

ํ•ฉ๋ณ‘ ์ •๋ ฌ๊ณผ ํ€ต ์ •๋ ฌ์€ ๋น„๊ตํ•˜๊ธฐ ์ข‹์€ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์ž‘์€ ๊ทธ๋ฃน์„ ์ •๋ ฌํ•œ ํ›„ ๋” ํฐ ๊ทธ๋ฃน์œผ๋กœ ํ•ฉ์ณ๋‚˜๊ฐ€๋Š” Bottom-Up ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ€ต ์ •๋ ฌ์€ ํฐ ๊ทธ๋ฃน์—์„œ๋ถ€ํ„ฐ ์ž‘์€ ๊ทธ๋ฃน์œผ๋กœ ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” Top-Down ๋ฐฉ์‹์ด์ง€์š”.

๋˜ํ•œ, ํ€ต ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€์ ์ธ ๊ตํ™˜๋งŒ์œผ๋กœ ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋˜์ง€๋งŒ ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์ถ”๊ฐ€์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ฉด์œผ๋กœ๋Š” ํ•ฉ๋ณ‘ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ nlogn์˜ ์ •๋ ฌ ์‹œ๊ฐ„์ด ๋ณด์žฅ๋˜๋ฉฐ, ์œ„์น˜๋ฅผ ๋‹ค์‹œ ๋ฐฐ์น˜ํ•˜๋Š” ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ๋™์ผํ•œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ๊ฐ–์ง€๋งŒ ํ€ต ์ •๋ ฌ์€ ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์š”์†Œ๋“ค์˜ ๊ฐœ์ˆ˜์ธ n์ด๋ฉฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ n์ œ๊ณฑ๊นŒ์ง€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์ด ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ •๋ ฌ ๋ฐฉ์‹์€ ๋ชจ๋‘ ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ„ํ•  & ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.