๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐˜š๐˜ญ๐˜ฐ๐˜ธ ๐˜ฃ๐˜ถ๐˜ต ๐˜ด๐˜ต๐˜ฆ๐˜ข๐˜ฅ๐˜บ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ - 2. ํ€ต ์ •๋ ฌ(Quick Sort) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ - 2. ํ€ต ์ •๋ ฌ(Quick Sort)

.23 2021. 7. 15. 20:39

2. ํ€ต ์ •๋ ฌ ; Quick Sort

2.1 ๊ฐœ๋…

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

 

1. ๋ถ„ํ• (Divide) : ์ •๋ ฌํ•  ์ง‘ํ•ฉ์„ ๊ธฐ์ค€๊ฐ’์„ ์ค‘์‹ฌ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ๋ถ„ํ• 

2. ์ •๋ณต(Conquer) : ๋ถ€๋ถ„์ง‘ํ•ฉ ๋‚ด์—์„œ ๊ธฐ์ค€๊ฐ’์˜ ์ •๋ ฌ ์œ„์น˜ ์„ ์ •

 

์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ค€๊ฐ’์„ ํ”ผ๋ด‡(Pivot) ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ ์›์†Œ / ๋งˆ์ง€๋ง‰ ์›์†Œ / ๊ฐ€์šด๋ฐ ์›์†Œ ๋“ฑ ์ž„์˜์˜ ์ˆœ์„œ์˜ ๊ฐ’์„ ์ •ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ •ํ•œ ๊ธฐ์ค€๊ฐ’์„ ์ค‘์‹ฌ์œผ๋กœ ์™ผ์ชฝ(L)๊ณผ ์˜ค๋ฅธ์ชฝ(R) ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ •๋ ฌํ•œ๋‹ค. ํ€ต ์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

 

  1. ์™ผ์ชฝ ๋์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํ”ผ๋ด‡๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋ฅผ ์ฐพ์•„ L๋กœ ํ‘œ์‹œํ•œ๋‹ค. ๋‹จ, L์€ R๊ณผ ๋งŒ๋‚˜๋ฉด ๋” ์ด์ƒ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค.
  2. ์˜ค๋ฅธ์ชฝ ๋์—์„œ ์™ผ์ชฝ์œผ๋กœ ์›€์ง์ด๋ฉด์„œ ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ์•„ R๋กœ ํ‘œ์‹œํ•œ๋‹ค. ๋‹จ, R์€ L๊ณผ ๋งŒ๋‚˜๋ฉด ๋” ์ด์ƒ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถ˜๋‹ค.
  3. 1๊ณผ 2์—์„œ ์ฐพ์€ L ์›์†Œ์™€ R ์›์†Œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„ ์„œ๋กœ ๊ตํ™˜ํ•˜๊ณ  L๊ณผ R์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ 1๊ณผ 2 ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. 1 ~ 2๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ L๊ณผ R์ด ๊ฐ™์€ ์›์†Œ์—์„œ ๋งŒ๋‚˜ ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ ํ”ผ๋ด‡๊ณผ R์˜ ์›์†Œ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ ๋’ค ์„œ๋กœ ๊ตํ™˜ํ•œ๋‹ค. ๊ตํ™˜๋œ ์ž๋ฆฌ๋ฅผ ํ”ผ๋ด‡ ์œ„์น˜๋กœ ํ™•์ •ํ•˜๊ณ  ํ˜„์žฌ ๋‹จ๊ณ„์˜ ํ€ต ์ •๋ ฌ์„ ๋๋‚ธ๋‹ค.
  5. ํ”ผ๋ด‡์˜ ํ™•์ •๋œ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ƒˆ๋กœ์šด ์™ผ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ์— ๋Œ€ํ•ด์„œ 1~3(4)์˜ ํ€ต ์ •๋ ฌ์„ ์ˆœํ™˜์ ์œผ๋กœ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜๋˜, ๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ 1 ์ดํ•˜๊ฐ€ ๋˜๋ฉด ์ „์ฒด ํ€ต ์ •๋ ฌ์„ ์ข…๋ฃŒํ•œ๋‹ค.

 

๊ทธ๋ฆผ๊ณผ ํ•จ๊ป˜ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž.

์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ง‘ํ•ฉ A๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

A = { 3, 8, 7, 2, 5, 1, 4, 6 }

์ง‘ํ•ฉ A๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด์ž. ํ€ต ์ •๋ ฌํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. ์ด ๋•Œ, ํ”ผ๋ด‡์€ ๊ฐ€์šด๋ฐ ์›์†Œ๋กœ ์„ค์ •ํ•œ๋‹ค.

 

1๋‹จ๊ณ„ : L์„ ํ”ผ๋ด‡ ๊ฐ’์ธ 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•˜๊ณ , R์„ 2๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค. L๊ณผ R์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์˜€์„ ๋•Œ 3์ด 1๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ๋‹ค์‹œ L์„ 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•˜๊ณ , R์„ 2๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค. ์ด ๋•Œ, L๊ณผ R์ด ๋งŒ๋‚˜ ๋ฉˆ์ท„๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฐ’๊ณผ ํ”ผ๋ด‡์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ , 2๊ฐ€ 8๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํ”ผ๋ด‡์ด์—ˆ๋˜ 2์˜ ์œ„์น˜๋ฅผ ํ™•์ •ํ•œ๋‹ค.

2๋‹จ๊ณ„ : ์™ผ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ์„ ํ•˜์ง€ ์•Š๊ณ , ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ๋งŒ ํ€ต ์ •๋ ฌ์„ ์‹คํ–‰ํ•œ๋‹ค. L์„ ํ”ผ๋ด‡ ๊ฐ’์ธ 5๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•˜๊ณ , R์„ 5๋ณด๋‹ค ์ž‘์€ ์›์†Œ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค. L๊ณผ R์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์›์†Œ์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์˜€์„ ๋•Œ 7์ด 4๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ๋‹ค์‹œ L๊ณผ R์„ ์ด๋™์‹œํ‚จ ๋’ค, ๋ฉˆ์ถ˜ ์ž๋ฆฌ์—์„œ ๊ฐ’์„ ์„œ๋กœ ๋น„๊ตํ•œ๋‹ค. 8๋ณด๋‹ค 2๊ฐ€ ๋” ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค. ๋‹ค์‹œ L๊ณผ R์„ ์ด๋™์‹œํ‚ค๋Š”๋ฐ R์ด L๊ณผ ๋งŒ๋‚˜ ๋ฉˆ์ท„๊ธฐ ๋•Œ๋ฌธ์— 8๊ณผ ํ”ผ๋ด‡์ธ 5์˜ ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„, 5๊ฐ€ 8๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•˜์ง€ ์•Š๊ณ  5์˜ ์œ„์น˜๋ฅผ ํ™•์ •ํ•œ๋‹ค.

3๋‹จ๊ณ„ : ์™ผ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ€ต ์ •๋ ฌ์„ ์‹คํ–‰ํ•œ๋‹ค. L์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”ผ๋ด‡๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์ด์ž ํ”ผ๋ด‡ ๊ฐ’์ธ 4์™€ R์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋น„๊ตํ•˜์˜€์„ ๋•Œ 4๋ณด๋‹ค 3์ด ๋” ์ž‘์œผ๋ฏ€๋กœ ๋‘ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ ๋’ค 4์˜ ์œ„์น˜๋ฅผ ํ™•์ •ํ•œ๋‹ค.

4๋‹จ๊ณ„ : ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ€ต ์ •๋ ฌ์„ ์‹คํ–‰ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ L๊ณผ R ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๊ตํ™˜ํ•œ ๋’ค, R์ด L๊ณผ ๋งŒ๋‚˜ ๋” ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ 7๊ณผ 8์„ ๋น„๊ตํ•˜์—ฌ 7์˜ ์œ„์น˜๋ฅผ ํ™•์ •ํ•œ๋‹ค.

5๋‹จ๊ณ„ : ๋ชจ๋“  ๋‚จ์€ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฏ€๋กœ ์œ„์น˜๋ฅผ ํ™•์ •ํ•œ ๋’ค ํ€ต ์ •๋ ฌ์„ ์ข…๋ฃŒํ•œ๋‹ค.

 

2.2 ์ฝ”๋“œ

ํ€ต ์ •๋ ฌ ์—ญ์‹œ ์ •๋ ฌ์„ ์œ„ํ•œ partition() ํ•จ์ˆ˜์™€ ๋ถ„ํ• ๊ณผ ํ€ต ์ •๋ ฌ์„ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” quickSort() ๋‘ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž‘๋™๋œ๋‹ค. ํ€ต ์†ŒํŠธ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ O(n log n) ์œผ๋กœ ๋น ๋ฅธ ํŽธ์ด์ง€๋งŒ, ํ”ผ๋ด‡ ์„ ์ • ์œ„์น˜์— ๋”ฐ๋ผ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n^2)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ •๋ ฌ ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ์ž๋ฆฌ ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์ •๋ ฌ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋œ๋‹ค.

 

์˜ˆ์ œ ์ฝ”๋“œ์˜ ํ”ผ๋ด‡์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

 

#1. partition(vector<int>::iterator begin, vector<int>::iterator end)

vector<int>::iterator partition(vector<int>::iterator begin, vector<int>::iterator end) {
    int pivot = *begin;
    auto left = begin + 1;
    auto right = end;

    while(true) {
        while(*left <= pivot && distance(left, right) > 0) left++;
        while(*right > pivot && distance(left, right) > 0) right--;

        if(left == right) break;
        else iter_swap(left, right);
    }

    if(pivot > *right)
        iter_swap(begin, right);

    return right;
}

 

#2. quickSort(vector<int>::iterator begin, vector<int>::iterator end)

void quickSort(vector<int>::iterator begin, vector<int>::iterator end) {
    if(distance(begin, end) >= 1) {
        auto it = partition(begin, end); // vector<int> it = partition(begin, end);
        quickSort(begin, it - 1);
        quickSort(it, end);
    }
}

+)

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

๐Ÿ”— : https://www.youtube.com/watch?v=ywWBy6J5gz8 

Comments