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

ํ€ต ์ •๋ ฌ์— ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋ถ€ํ„ฐ ์‚ดํŽด๋ด…์‹œ๋‹ค.

์šฉ์–ด ์„ค๋ช…
Pivot ์ •๋ ฌ์˜ ์ค‘์‹ฌ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฝ์„ ๋•Œ๋Š” ํ”ผ๋ฒ—(Pivot)์ด๋ผ๊ณ  ์ฝ์Šต๋‹ˆ๋‹ค.
Low Pivot์„ ์ œ์™ธํ•œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
High Pivot์„ ์ œ์™ธํ•œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
Left ์ •๋ ฌํ•œ ์š”์†Œ๋“ค์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค
Right ์ •๋ ฌํ•  ์š”์†Œ๋“ค์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ง€์ ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ ๊ทธ๋ฆผ์„ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ด…์‹œ๋‹ค. ์—ฌ๊ธฐ์„œ pivot์€ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ < ์š”์†Œ 6 > ์ž…๋‹ˆ๋‹ค.

ํ€ต ์ •๋ ฌ ์šฉ์–ด ์„ค๋ช…


low๋Š” < ์š”์†Œ 3 > ์ด๋ฉฐ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ high๋Š” < ์š”์†Œ 7 > ์ด๋ฉฐ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  low์™€ high๋Š” ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ํ•œ ์นธ์”ฉ ์›€์ง์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ„๊ฐœ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.


ํ€ต ์ •๋ ฌ ์ง„ํ–‰

์ง„ํ–‰ ๊ทœ์น™์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. high๋Š” pivot ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ๊ณ  ๋ฐ˜๋Œ€๋กœ low๋Š” pivot ๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๊ฒฝ์šฐ high์™€ low๊ฐ€ ์ฐพ์€ ๊ฐ’์„ ์„œ๋กœ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์ด์ง€์š”.

ํ€ต ์ •๋ ฌ Step 1


< ๊ตํ™˜ 1ํšŒ ์ง„ํ–‰ > ํ›„์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. high๊ฐ€ ์ฐพ์€ < ์š”์†Œ 2 >์™€ low๊ฐ€ ์ฐพ์€ < ์š”์†Œ 9 >๊ฐ€ ๊ตํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. high์™€ low๊ฐ€ ์„œ๋กœ ๊ตํ™˜๋œ ํ›„์—๋„ high๋Š” ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ pivot ๋ณด๋‹ค ๋” ํฐ ๊ฐ’์„ ์ฐพ์•„ ์ด๋™ํ•˜๊ณ  low๋Š” ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ pivot ๋ณด๋‹ค ๋” ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ ์›€์ง์ž…๋‹ˆ๋‹ค.

ํ€ต ์ •๋ ฌ Step 2


high๋Š” pivot์ธ < ์š”์†Œ 6 >๋ณด๋‹ค ์ž‘์€ < ์š”์†Œ 1 >์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ , low๋Š” pivot๋ณด๋‹ค ํฐ < ์š”์†Œ 9 >๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ง€๊ธˆ์ฒ˜๋Ÿผ high์™€ low๊ฐ€ ์„œ๋กœ ๊ต์ฐจ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์„œ๋กœ ๊ฐ’์„ ๊ตํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” high์™€ low์˜ ์ด๋™๊ณผ ๊ตํ™˜์ด ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ์Œ์„ ๋œปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”.

"์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” pivot๊ณผ high๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋ฐ”๊พธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค."

ํ€ต ์ •๋ ฌ Step 3


์ด๋™ํ•œ pivot ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ณด๋ฉด ์•ž์—์„œ ๋„ค ๋ฒˆ์งธ์— ์œ„์น˜ํ•ด์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌ ๋Œ€์ƒ์ด 6๊ฐœ์˜ ์š”์†Œ๋ฐ–์— ๋˜์ง€ ์•Š์•„ ๋ˆˆ์น˜์ฑ„์‹  ๋ถ„๋“ค๋„ ๊ณ„์‹œ๊ฒ ์ง€๋งŒ ๋ฐฉ๊ธˆ ๊ตํ™˜์œผ๋กœ ์ธํ•˜์—ฌ < ์š”์†Œ 6 >์€ ์ž์‹ ์˜ ์ •๋ ฌ ์œ„์น˜๋ฅผ ์ฐพ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„์—๋Š” ์ž์‹ ์˜ ์ •๋ ฌ ์œ„์น˜๋ฅผ ์ฐพ์€ < ์š”์†Œ 6 >์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด ์œ„ ๊ณผ์ •์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ€ต ์ •๋ ฌ Step 4


ํ€ต ์ •๋ ฌ ๊ตฌํ˜„

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

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

void Swap(int arr[], int firstIndex, int secondIndex)
{
    int temp = arr[firstIndex];
    arr[firstIndex] = arr[secondIndex];
    arr[secondIndex] = temp;
}

int Partition(int arr[], int left, int right)
{
    // pivot์˜ ์œ„์น˜๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ ์š”์†Œ๋กœ ์ •ํ•œ๋‹ค.
    int pivot = arr[left];
    int low = left + 1;
    int high = right;

    // low์™€ high๊ฐ€ ๊ต์ฐจ๋˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€
    while (low <= high)
    {
        // low๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
        while (pivot >= arr[low] && low <= right)
            low++;

        // high๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
        while (pivot <= arr[high] && high >= (left+1))
            high--;
 
        // low์™€ high๊ฐ€ ๊ต์ฐจํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‘ ๊ฐ’์„ ๊ตํ™˜ํ•œ๋‹ค.
        if (low <= high) Swap(arr, low, high);
    }
    // ํ”ผ๋ฒ—๊ณผ high๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
    Swap(arr, left, high);
    return high;
}

void QuickSort(int arr[], int left, int right)
{
    if (left <= right)
    {
        // ๋ถ„ํ• ํ•œ๋‹ค.
        int pivot = Partition(arr, left, right);

        // ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•œ๋‹ค.
        QuickSort(arr, left, pivot - 1);
 
        // ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•œ๋‹ค.
        QuickSort(arr, pivot + 1, right);
    }
}

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

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

low์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  high์˜ ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ด…์‹œ๋‹ค. ๋จผ์ € low์˜ ์ฆ๊ฐ€ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

/* pivot ๋ณด๋‹ค ๋” ํฐ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ์กฐ๊ฑด */
1) pivot >= arr[low]

/* low์˜ ๊ฐ’์ด right์˜ ๊ฐ’๋ณด๋‹ค ๋” ์ปค์ง€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ„ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ */
2) low <= right

๋‹ค์Œ์œผ๋กœ high์˜ ๊ฐ์†Œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

/* high๋Š” pivot ๋ณด๋‹ค ๋” ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ์กฐ๊ฑด */
1) pivot >= arr[low]

/* high์˜ ๊ฐ’์ด (left + 1)๋ณด๋‹ค ์ž‘์•„์ง€๋Š” ๊ฒฝ์šฐ๋Š” pivot์„ ๊ฐ€๋ฆฌํ‚ค๊ฑฐ๋‚˜ ๋ฐฐ์—ด์˜ ์ตœ์†Œ ์ธ๋ฑ์Šค ๋„˜์–ด ๊ฐ€๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ */
2) high >= (left + 1)


pivot์˜ ์œ„์น˜์— ๋Œ€ํ•ด์„œ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์ง„ํ–‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ pivot์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถˆ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์™€ ๋‹ค๋ฅด๊ฒŒ pivot์ด ์ค‘๊ฐ„์— ์œ„์น˜ํ•˜๋ฉด ์ •๋ ฌ ์š”์†Œ๋“ค์ด ๊ท ๋“ฑํ•˜๊ฒŒ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ pivot์˜ ์œ„์น˜๋ฅผ ์ค‘๊ฐ„์— ์žˆ๋Š” ์š”์†Œ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ฐ€์žฅ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ „์ฒด์˜ ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•ด์„œ ์ค‘๊ฐ„๊ฐ’์„ ์ฐพ๋Š” ์ž‘์—…์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— pivot์€ ์ขŒ์ธก ๋, ์ค‘์•™, ์šฐ์ธก ๋ ์ค‘ ์ค‘๊ฐ„๊ฐ’์„ ์ด์šฉํ•ด์„œ ์ •ํ•ฉ๋‹ˆ๋‹ค.


ํ€ต ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์€?

pivot์ด ์ž์‹ ์˜ ์ž๋ฆฌ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋น„๊ต ์—ฐ์‚ฐ์€ ์š”์†Œ๋“ค์˜ ๊ฐœ์ˆ˜์ธ n๋ฒˆ ๋งŒํผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  pivot์ธ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ธํ•ด n๋ณด๋‹ค ํ•˜๋‚˜ ์ ์€ ํšŸ์ˆ˜์˜ ๋น„๊ต ์—ฐ์‚ฐ์ด ์ง„ํ–‰๋˜์ง€๋งŒ, ์ด๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ถ„ํ• ์ด ๋ช‡ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€๋„ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 31๊ฐœ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ๊ฐ€์žฅ ์ด์ƒ์ ์œผ๋กœ pivot์˜ ์œ„์น˜๊ฐ€ ์ค‘๊ฐ„์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ถ„ํ•  ๊ณผ์ •์—์„œ ์ „์ฒด ์š”์†Œ๋“ค์€ 15๊ฐœ์”ฉ ๋‘˜๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ฒˆ ๋ถ„ํ• ์—์„œ ๊ฐ๊ฐ 7๊ฐœ์”ฉ ๋‚˜๋‰˜์–ด ์ด 4๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์ด ์˜์—ญ๋“ค์€ ๋˜ ๋‹ค์‹œ 3๊ฐœ์”ฉ์˜ ์š”์†Œ๋“ค๋กœ ๋‚˜๋‰˜์–ด 3๊ฐœ์”ฉ์˜ ์š”์†Œ๋“ค๋กœ ๋‚˜๋‰˜์–ด ์ด 8๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ๋Š” 1๊ฐœ์”ฉ ๋‚˜๋‰˜์–ด ์ด 16๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

๋ถ„ํ• ํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ k๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์š”์†Œ๋“ค์˜ ๊ฐœ์ˆ˜ n๊ณผ k๋Š” \(k=\log _{ 2 }{ n }\)์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ€ต ์ •๋ ฌ์˜ ๋น„๊ต ํšŸ์ˆ˜๋Š” \(n\log _{ 2 }{ n }\) ์ด๋ฉฐ ๋น…-์˜ค ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด \(o(n\log _{ 2 }{ n } )\) ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์š”์†Œ๋“ค์ด ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ pivot์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(์˜ˆ์ œ์ฒ˜๋Ÿผ pivot์„ ์ง€์ •)์ด๋ผ๋ฉด \(k=n\) ์ด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” \(o({ n }^{ 2 })\) ๊ฐ€ ์„ฑ๋ฆฝ๋ฉ๋‹ˆ๋‹ค.