์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ณ‘ํ•ฉ ์ •๋ ฌ

youngdeok 2023. 2. 28. 19:58

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ง๊ทธ๋Œ€๋กœ “๋ถ„ํ• ”ํ•˜์—ฌ “์ •๋ณต” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • 1๋‹จ๊ณ„ (๋ถ„ํ• ) ํ•ด๊ฒฐ์ด ์šฉ์ดํ•œ ๋‹จ๊ณ„๊นŒ์ง€ ๋ถ„ํ• ํ•ด ๋‚˜๊ฐ„๋‹ค.
  • 2๋‹จ๊ณ„ (์ •๋ณต) ํ•ด๊ฒฐ์ด ์šฉ์ดํ•œ ์ˆ˜์ค€๊นŒ์ง€ ๋ถ„ํ• ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
  • 3๋‹จ๊ณ„ (๊ฒฐํ•ฉ) ๋ถ„ํ• ํ•ด์„œ ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 8๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ •๋ ฌํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค, ์ด๋ฅผ ๋‘˜๋กœ๋‚˜๋ˆ  4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ณ , ๋˜ ์ด๋“ค ๊ฐ๊ฐ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‘˜๋กœ ๋‚˜๋ˆ ์„œ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค.

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

code

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

void MergeTwoArea(int arr[], int left, int mid, int right)
{
    int fIdx = left;
    int rIdx = mid + 1;
    int sIdx = left;

    int *sortArr = (int *)malloc(sizeof(right) + 1);

    while (fIdx <= mid && rIdx <= right) // ์ด ๋ถ€๋ถ„์„ ์ดํ•ด ํ•ด์•ผํ•œ๋‹ค. 
    {
        if (arr[fIdx] < arr[rIdx])
            sortArr[sIdx] = arr[fIdx++];
        else
            sortArr[sIdx] = arr[rIdx++];
        sIdx++;
    }
    if (fIdx > mid)
    {
        for (int i = rIdx; i <= right; i++, sIdx++)
        {
            sortArr[sIdx] = arr[i];
        }
    }
    else
    {
        for (int i = fIdx; i <= mid; i++, sIdx++)
        {
            sortArr[sIdx] = arr[i];
        }
    }

    for (int i = left; i <= right; i++)
    {
        arr[i] = sortArr[i];
    }
    free(sortArr);
}

void MergeSort(int arr[], int left, int right)
{
    int mid;
    if (left < right)
    {
        mid = (left + right) / 2;
        MergeSort(arr, left, mid);
        MergeSort(arr, mid + 1, right);
        MergeTwoArea(arr, left, mid ,right);
    }
}

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

    MergeSort(arr, 0, sizeof(arr) / sizeof(int));
    for (int i = 0; i < 8; i++)
        printf("%d ", arr[i]);
    return 0;
}

ํ•˜๋‚˜์™€ ํ•˜๋‚˜ ๊ฐ€ ๋ชจ์—ฌ 2๊ฐœ ๊ฐ€ ๋ ๋•Œ, ๋น„๊ต์—ฐ์‚ฐ์€ 2ํšŒ ์ง„ํ–‰๋œ๋‹ค.

while (fIdx <= mid && rIdx <= right) { if (arr[fIdx] < arr[rIdx]) sortArr[sIdx] = arr[fIdx++]; else sortArr[sIdx] = arr[rIdx++]; sIdx++; } if (fIdx > mid) { for (int i = rIdx; i <= right; i++, sIdx++) { sortArr[sIdx] = arr[i]; } } else { for (int i = fIdx; i <= mid; i++, sIdx++) { sortArr[sIdx] = arr[i]; } } for (int i = left; i <= right; i++) { arr[i] = sortArr[i]; }

while๋ฌธ์„ ์ง€๋‚  ๋•Œ, if~else๋ฌธ์„ ์ง€๋‚  ๋•Œ.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋ณ‘ํ•ฉ 1์„ ์ง€๋‚  ๋•Œ์˜ ๋น„๊ต์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” 8ํšŒ์ด๋‹ค.

๋‘๊ฐœ์™€ ๋‘๊ฐœ๊ฐ€ ๋ชจ์—ฌ 4๊ฐœ๊ฐ€ ๋  ๋•Œ?. ๋น„๊ต์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” 8ํšŒ์ด๋‹ค.

์ด๋ ‡๋“ฏ ๋งˆ์ง€๋ง‰ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์„ ๋•Œ ๊นŒ์ง€ ๋น„๊ต์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ์— ๋น„๊ต์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜๋Š” ์ด 8ํšŒ์ด๋‹ค.

“์ •๋ ฌ์˜ ๋Œ€์ƒ์ธ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ n๊ฐœ ์ผ๋•Œ, ๋ณ‘ํ•ฉ ์ •๋ ฌ์—์„œ ์ง„ํ–‰๋˜๋Š” ์ตœ๋Œ€ ์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ n๋ฒˆ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ๋น„๊ต์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๋น…-์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

O(n log2n)

๋ณ‘ํ•ฉ ์ •๋ ฌ

๋ณ‘ํ•ฉ ์ •๋ ฌ

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ง๊ทธ๋Œ€๋กœ “๋ถ„ํ• ”ํ•˜์—ฌ “์ •๋ณต” ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • 1๋‹จ๊ณ„ (๋ถ„ํ• ) ํ•ด๊ฒฐ์ด ์šฉ์ดํ•œ ๋‹จ๊ณ„๊นŒ์ง€ ๋ถ„ํ• ํ•ด ๋‚˜๊ฐ„๋‹ค.
  • 2๋‹จ๊ณ„ (์ •๋ณต) ํ•ด๊ฒฐ์ด ์šฉ์ดํ•œ ์ˆ˜์ค€๊นŒ์ง€ ๋ถ„ํ• ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.
  • 3๋‹จ๊ณ„ (๊ฒฐํ•ฉ) ๋ถ„ํ• ํ•ด์„œ ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 8๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ •๋ ฌํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค, ์ด๋ฅผ ๋‘˜๋กœ๋‚˜๋ˆ  4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ณ , ๋˜ ์ด๋“ค ๊ฐ๊ฐ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‘˜๋กœ ๋‚˜๋ˆ ์„œ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค.

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

code

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

void MergeTwoArea(int arr[], int left, int mid, int right)
{
    int fIdx = left;
    int rIdx = mid + 1;
    int sIdx = left;

    int *sortArr = (int *)malloc(sizeof(right) + 1);

    while (fIdx <= mid && rIdx <= right) // ์ด ๋ถ€๋ถ„์„ ์ดํ•ด ํ•ด์•ผํ•œ๋‹ค. 
    {
        if (arr[fIdx] < arr[rIdx])
            sortArr[sIdx] = arr[fIdx++];
        else
            sortArr[sIdx] = arr[rIdx++];
        sIdx++;
    }
    if (fIdx > mid)
    {
        for (int i = rIdx; i <= right; i++, sIdx++)
        {
            sortArr[sIdx] = arr[i];
        }
    }
    else
    {
        for (int i = fIdx; i <= mid; i++, sIdx++)
        {
            sortArr[sIdx] = arr[i];
        }
    }

    for (int i = left; i <= right; i++)
    {
        arr[i] = sortArr[i];
    }
    free(sortArr);
}

void MergeSort(int arr[], int left, int right)
{
    int mid;
    if (left < right)
    {
        mid = (left + right) / 2;
        MergeSort(arr, left, mid);
        MergeSort(arr, mid + 1, right);
        MergeTwoArea(arr, left, mid ,right);
    }
}

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

    MergeSort(arr, 0, sizeof(arr) / sizeof(int));
    for (int i = 0; i < 8; i++)
        printf("%d ", arr[i]);
    return 0;
}

ํ•˜๋‚˜์™€ ํ•˜๋‚˜ ๊ฐ€ ๋ชจ์—ฌ 2๊ฐœ ๊ฐ€ ๋ ๋•Œ, ๋น„๊ต์—ฐ์‚ฐ์€ 2ํšŒ ์ง„ํ–‰๋œ๋‹ค.

while (fIdx <= mid && rIdx <= right)
{
if (arr[fIdx] < arr[rIdx])
sortArr[sIdx] = arr[fIdx++];
else
sortArr[sIdx] = arr[rIdx++];
sIdx++;
}
if (fIdx > mid)
{
for (int i = rIdx; i <= right; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
else
{
for (int i = fIdx; i <= mid; i++, sIdx++)
{
sortArr[sIdx] = arr[i];
}
}
for (int i = left; i <= right; i++)
{
arr[i] = sortArr[i];
}

while๋ฌธ์„ ์ง€๋‚  ๋•Œ, if~else๋ฌธ์„ ์ง€๋‚  ๋•Œ.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋ณ‘ํ•ฉ 1์„ ์ง€๋‚  ๋•Œ์˜ ๋น„๊ต์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” 8ํšŒ์ด๋‹ค.

๋‘๊ฐœ์™€ ๋‘๊ฐœ๊ฐ€ ๋ชจ์—ฌ 4๊ฐœ๊ฐ€ ๋  ๋•Œ?. ๋น„๊ต์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” 8ํšŒ์ด๋‹ค.

์ด๋ ‡๋“ฏ ๋งˆ์ง€๋ง‰ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์„ ๋•Œ ๊นŒ์ง€ ๋น„๊ต์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ์— ๋น„๊ต์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜๋Š” ์ด 8ํšŒ์ด๋‹ค.

“์ •๋ ฌ์˜ ๋Œ€์ƒ์ธ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ n๊ฐœ ์ผ๋•Œ, ๋ณ‘ํ•ฉ ์ •๋ ฌ์—์„œ ์ง„ํ–‰๋˜๋Š” ์ตœ๋Œ€ ์—ฐ์‚ฐ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ n๋ฒˆ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ๋น„๊ต์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๋น…-์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

O(n log2n)

'์•Œ๊ณ ๋ฆฌ์ฆ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ€ต ์ •๋ ฌ  (0) 2023.02.28