๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

10. ํ•ฉ๋ณ‘์ •๋ ฌ (merge sort)

by devshin.kr 2020. 10. 15.
728x90

- ๋ถ„ํ• ์ •๋ณต์•Œ๊ณ ๋ฆฌ์ฆ˜(Divide and Conquer)

๊ทธ๋ƒฅ ๋ง ๊ทธ๋Œ€๋กœ, ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ , ํ•ด๊ฒฐํ•˜๊ณ , ... ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

1. ๋ถ„ํ•  : ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ž‘์€ ํฌ๊ธฐ์˜ ๋™์ผํ•œ ๋ฌธ์ œ๋“ค๋กœ ๋ถ„ํ• 

2. ์ •๋ณต : ๊ฐ๊ฐ์˜ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์ˆœํ™˜์ ์œผ๋กœ ํ•ด๊ฒฐ

3. ํ•ฉ๋ณ‘ : ์ž‘์€ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ํ•ฉํ•˜์—ฌ(merge), ์›๋ž˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๋ฅผ ๊ตฌํ•จ

 

๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ• ์ •๋ณต์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ํ•ฉ๋ณ‘์ •๋ ฌ(merge sort)๊ณผ ํ€ต์ •๋ ฌ(quick sort)์ด ์žˆ๋‹ค.

 

๋ถ„ํ• ์€ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ๊ฐ์ž ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฐ๊ฐ์˜ ์ž‘์€ ๋ฌธ์ œ๋“ค์€ ์›๋ž˜ ๋ฌธ์ œ์™€ ๋™์ผํ•œ ๋ฌธ์ œ์—ฌ์•ผ ํ•œ๋‹ค.

์ •๋ณต์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ๊ฐ๊ฐ์˜ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์œ„์˜ ๊ทธ๋ฆผ์€ ํ•ฉ๋ณ‘์ •๋ ฌ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ ์˜ˆ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

์ˆœ์„œ :

1. ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ๋™์ผํ•œ ํฌ๊ธฐ์˜ ์ž‘์€ ๋ฌธ์ œ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค. (๋ถ„ํ• . divide)

2. ๊ฐ๊ฐ์˜ ์ž‘์€ ๋ฌธ์ œ ๋‘ ๊ฐœ์—์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ฐ๊ฐ ๊ตฌํ•œ๋‹ค. (์ •๋ณต. conquer)

3. ์ฒซ ๋ฒˆ์งธ ์ž‘์€ ๋ฌธ์ œ์—์„œ์˜ ์ตœ๋Œ“๊ฐ’๊ณผ, ๋‘ ๋ฒˆ์งธ ์ž‘์€ ๋ฌธ์ œ์—์„œ์˜ ์ตœ๋Œ“๊ฐ’์„ ๋น„๊ตํ•ด ์ตœ์ข… ์œ„ ๋ฐฐ์—ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ๋‹ค. (ํ•ฉ๋ณ‘. merge)

 

๋ถ„ํ• ์ •๋ณต๋ฒ•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœํ™˜(recursion)์„ ์ด์šฉํ•œ๋‹ค.

 

 

 

 

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋ณด์ž.

์ดˆ๊ธฐ ๋ฐฐ์—ด์€ 52471326์ด๋‹ค. ์ด๋ฅผ ํ•ฉ๋ณ‘์ •๋ ฌํ•ด 122345์˜ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์ด๋‹ค.

 

 

 

ํ•ฉ๋ณ‘์ •๋ ฌ์˜ Sudo Code (์˜์‚ฌ ์ฝ”๋“œ)

mergeSort(A[], p, r)    // A[p... r]์„ ์ •๋ ฌํ•œ๋‹ค.
{
    if (p < r) then {
        q <- (p + q) / 2;       // (1) p, q์˜ ์ค‘๊ฐ„ ์ง€์  ๊ณ„์‚ฐ
        mergeSort(A, p, q);    // (2) ์ „๋ฐ˜๋ถ€ ์ •๋ ฌ
        mergeSort(A, q+1, r); // (3) ํ›„๋ฐ˜๋ถ€ ์ •๋ ฌ
        merge(A, p, q, r);      // (4) ํ•ฉ๋ณ‘
    }
}

merge(A[], p, q, r)
{
    ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋‘ ๋ฐฐ์—ด A[p...q]์™€ A[q+1... r]์„ ํ•ฉํ•˜์—ฌ
    ์ •๋ ฌ๋œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด A[p...r]์„ ๋งŒ๋“ ๋‹ค.
}

 

 

์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ

void merge (int data[], int p, int q, int r)

{

    int i = p, j = q+1, k = p;

    int tmp[data.length()];

    while (i <= q && j <= r) {

        if (data[i] <= data[j])

            tmp[k++] = data[i++];

        else

            tmp[k++] = data[j++];

    }

    while (i <= q)

        tmp[k++] = data[i++];

    while (j <= r)

        tmp[k++] = data[j++];

    for (int i = p; i <= r; i++)

        data[i] = tmp[i];

}

 

์‹œ๊ฐ„๋ณต์žก๋„

T(n) = 0                         (n=1)

        T(n/2) + T(n/2) + n   (otherwise)

 

๋Œ“๊ธ€