๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Knowledge/Algorithm

[Algorithm]ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ํŒŒ์ด์ฌ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ธฐ

by YJ Dev 2024. 7. 24.
728x90
๋ฐ˜์‘ํ˜•
SMALL

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

ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜


01. ํ€ต์ •๋ ฌ์˜ ๊ฐœ๋…๐Ÿ“š

ํ€ต์ •๋ ฌ(Quick Sort)์€ ๋น„๊ต ๊ธฐ๋ฐ˜์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ํ‰๊ท ์ ์œผ๋กœ ๋งค์šฐ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ€ต์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer) ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ํ€ต์ •๋ ฌ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ธฐ์ค€ ์„ ํƒ (Pivot Selection): ๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ธฐ์ค€์ (Pivot)์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ค€์ ์€ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ถ„ํ•  (Partitioning): ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ๊ธฐ์ค€์ ์˜ ์™ผ์ชฝ์—, ํฐ ๊ฐ’๋“ค์€ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•˜๋„๋ก ์žฌ๋ฐฐ์—ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ธฐ์ค€์ ์€ ์ตœ์ข… ์œ„์น˜์— ๋†“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. ์žฌ๊ท€์  ์ •๋ ฌ (Recursive Sort): ๊ธฐ์ค€์ ์„ ์ œ์™ธํ•œ ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต์ •๋ ฌ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1 ์ดํ•˜๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

ํ€ต์ •๋ ฌ์˜ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๋ฐฐ์—ด์—์„œ ๊ธฐ์ค€์ (Pivot)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
  3. ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์„ ๊ฐ๊ฐ ๋‹ค์‹œ ํ€ต์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜๋ฉด ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

ํ€ต์ •๋ ฌ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์žฅ์ 

  • ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • ์ œ์ž๋ฆฌ ์ •๋ ฌ: ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์žฌ๊ท€ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•˜๋ฉด).

๋‹จ์ 

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n²)๋กœ, ๋ฐฐ์—ด์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ: ๋™์ผํ•œ ๊ฐ’์˜ ์š”์†Œ๋“ค์˜ ์ƒ๋Œ€์ ์ธ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

02. ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‹จ๊ณ„๋ณ„ ์„ค๋ช…๐Ÿ“

ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‹จ๊ณ„๋ณ„ ์„ค๋ช…์„ ์œ„ํ•ด, ์˜ˆ์‹œ ๋ฐฐ์—ด [3, 6, 8, 10, 1, 2, 1]์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๊ธฐ์ค€์  ์„ ํƒ (Pivot Selection)

๋จผ์ €, ๋ฐฐ์—ด์—์„œ ๊ธฐ์ค€์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ฒซ ๋ฒˆ์งธ ์š”์†Œ, ๋งˆ์ง€๋ง‰ ์š”์†Œ, ์ค‘๊ฐ„ ์š”์†Œ, ๋˜๋Š” ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋œ ์š”์†Œ๋ฅผ ๊ธฐ์ค€์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ 3์„ ๊ธฐ์ค€์ ์œผ๋กœ ์„ ํƒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2. ๋ถ„ํ•  (Partitioning)

๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ์™ผ์ชฝ์—, ํฐ ๊ฐ’๋“ค์€ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•˜๋„๋ก ์žฌ๋ฐฐ์—ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ธฐ์ค€์ ์€ ์ตœ์ข… ์œ„์น˜์— ๋†“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ถ„ํ•  ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋ฐฐ์—ด: [3, 6, 8, 10, 1, 2, 1]
  • ๊ธฐ์ค€์ : 3

์™ผ์ชฝ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ธฐ์ค€์ ๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ’์„ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ดˆ๊ธฐ ์ƒํƒœ: [3, 6, 8, 10, 1, 2, 1]
  • 6 (๊ธฐ์ค€์ ๋ณด๋‹ค ํผ)๊ณผ 1 (๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์Œ)์„ ๊ตํ™˜: [3, 1, 8, 10, 1, 2, 6]
  • 8 (๊ธฐ์ค€์ ๋ณด๋‹ค ํผ)๊ณผ 2 (๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์Œ)์„ ๊ตํ™˜: [3, 1, 2, 10, 1, 8, 6]
  • 10 (๊ธฐ์ค€์ ๋ณด๋‹ค ํผ)๊ณผ 1 (๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์Œ)์„ ๊ตํ™˜: [3, 1, 2, 1, 10, 8, 6]
  • ์ตœ์ข… ์ƒํƒœ: [1, 1, 2, 3, 10, 8, 6]

์ด์ œ 3์€ ๋ฐฐ์—ด์˜ ๋„ค ๋ฒˆ์งธ ์œ„์น˜์— ์žˆ์œผ๋ฉฐ, ์™ผ์ชฝ์—๋Š” 3๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค, ์˜ค๋ฅธ์ชฝ์—๋Š” 3๋ณด๋‹ค ํฐ ๊ฐ’๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

3. ์žฌ๊ท€์  ์ •๋ ฌ (Recursive Sort)

๊ธฐ์ค€์ ์„ ์ œ์™ธํ•œ ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ํ€ต์ •๋ ฌ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์™ผ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด [1, 1, 2]

  • ๊ธฐ์ค€์ : 1
  • [1, 1, 2]๋Š” ์ด๋ฏธ 1๋ณด๋‹ค ์ž‘์€ ๊ฐ’๊ณผ ํฐ ๊ฐ’์œผ๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋ถ„ํ• :
    • [1] (๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์Œ)๊ณผ [2] (๊ธฐ์ค€์ ๋ณด๋‹ค ํผ)
  • ์ตœ์ข… ์ •๋ ฌ: [1, 1, 2]

์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฐฐ์—ด [10, 8, 6]

  • ๊ธฐ์ค€์ : 10
  • [10, 8, 6]์€ ์ด๋ฏธ 10๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋ถ„ํ• : [8, 6] (๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์Œ)
  • ์ตœ์ข… ์ •๋ ฌ: [6, 8, 10]

4. ์ตœ์ข… ์ •๋ ฌ

๋ชจ๋“  ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜๋ฉด ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ๋ฐฐ์—ด์€ [1, 1, 2, 3, 6, 8, 10]์ž…๋‹ˆ๋‹ค.

์š”์•ฝ

  1. ๊ธฐ์ค€์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํ€ต์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜๋ฉด ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

[3, 6, 8, 10, 1, 2, 1]  --๊ธฐ์ค€์ : 3-->
[1, 1, 2, 3, 10, 8, 6]
[1, 1, 2] --๊ธฐ์ค€์ : 1--> [1, 1, 2]  [10, 8, 6] --๊ธฐ์ค€์ : 10--> [6, 8, 10]
์ตœ์ข… ๋ฐฐ์—ด: [1, 1, 2, 3, 6, 8, 10]

03. ํŒŒ์ด์ฌ์œผ๋กœ ํ€ต์ •๋ ฌ ๊ตฌํ˜„ํ•˜๊ธฐ๐Ÿ

๋‹ค์Œ์€ ํŒŒ์ด์ฌ์œผ๋กœ ํ€ต์ •๋ ฌ์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

def median_of_three(arr):
    # ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ, ์ค‘๊ฐ„, ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    first = arr[0]
    middle = arr[len(arr) // 2]
    last = arr[-1]
    # ์„ธ ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ค‘์•™๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    return sorted([first, middle, last])[1]

def optimized_quicksort(arr):
    # ๊ธฐ๋ณธ ์‚ฌ๋ก€: ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    if len(arr) <= 1:
        return arr
    
    # ๊ธฐ์ค€์ ์„ median_of_three ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    pivot = median_of_three(arr)
    
    # ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    left = [x for x in arr if x < pivot]
    
    # ๊ธฐ์ค€์ ๊ณผ ๋™์ผํ•œ ์š”์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    middle = [x for x in arr if x == pivot]
    
    # ๊ธฐ์ค€์ ๋ณด๋‹ค ํฐ ์š”์†Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    right = [x for x in arr if x > pivot]
    
    # ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ณ , ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    return optimized_quicksort(left) + middle + optimized_quicksort(right)

# ์˜ˆ์‹œ ๋ฐฐ์—ด
arr = [3, 6, 8, 10, 1, 2, 1]

# ์ตœ์ ํ™”๋œ ํ€ต์ •๋ ฌ์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
sorted_arr = optimized_quicksort(arr)
print(sorted_arr)

์ฝ”๋“œ ์„ค๋ช…:

1. median_of_three ํ•จ์ˆ˜:

  • ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ (first), ์ค‘๊ฐ„ ์š”์†Œ (middle), ๋งˆ์ง€๋ง‰ ์š”์†Œ (last)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์„ธ ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ค‘์•™๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค‘์•™๊ฐ’์ด ํ€ต์ •๋ ฌ์˜ ๊ธฐ์ค€์ ์ด ๋ฉ๋‹ˆ๋‹ค.

2. optimized_quicksort ํ•จ์ˆ˜:

  • ๊ธฐ๋ณธ ์‚ฌ๋ก€ ์ฒ˜๋ฆฌ: ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์ด ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์ค€์  ์„ ํƒ: median_of_three ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์ค€์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„ํ• :
    - left ๋ฆฌ์ŠคํŠธ: ๊ธฐ์ค€์ ๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ.
    - middle ๋ฆฌ์ŠคํŠธ: ๊ธฐ์ค€์ ๊ณผ ๋™์ผํ•œ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ.
    - right ๋ฆฌ์ŠคํŠธ: ๊ธฐ์ค€์ ๋ณด๋‹ค ํฐ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ.
  • ์žฌ๊ท€์  ํ˜ธ์ถœ: left์™€ right ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ optimized_quicksort ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ๊ฐ์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐํ•ฉ: ์ •๋ ฌ๋œ left ๋ฆฌ์ŠคํŠธ, middle ๋ฆฌ์ŠคํŠธ, ์ •๋ ฌ๋œ right ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

04. ํ€ต์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„โฑ

ํ€ต์ •๋ ฌ(Quick Sort)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ”ผ๋ฒ—(pivot) ์„ ํƒ๊ณผ ๋ฐฐ์—ด ๋ถ„ํ• ์ด ์–ผ๋งˆ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํ€ต์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํ‰๊ท ์ ์œผ๋กœ ๋งค์šฐ ํšจ์œจ์ ์ด์ง€๋งŒ, ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)

ํ€ต์ •๋ ฌ์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n log n)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐ์—ด์ด ๋žœ๋ค ํ•˜๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์žˆ์„ ๋•Œ, ๊ฐ ๋ถ„ํ•  ๋‹จ๊ณ„์—์„œ ๋ฐฐ์—ด์ด ๋Œ€๋žต ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋ˆ„์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ถ„ํ•  ๋‹จ๊ณ„: ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
  2. ์žฌ๊ท€ ํ˜ธ์ถœ: ๋‚˜๋ˆ ์ง„ ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํ€ต์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ถ„ํ• ์˜ ๊นŠ์ด: ๋ฐฐ์—ด์ด ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋‰˜๋ฏ€๋กœ, ๋ถ„ํ• ์˜ ๊นŠ์ด๋Š” log n ๋‹จ๊ณ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…๋Ÿ‰: ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋น„๊ตํ•˜๋ฏ€๋กœ, ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…๋Ÿ‰์€ O(n) ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ํ‰๊ท ์ ์œผ๋กœ log n ๋‹จ๊ณ„์—์„œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค O(n)์˜ ์ž‘์—…๋Ÿ‰์ด ํ•„์š”ํ•˜์—ฌ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n log n) ์ด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n²)

ํ€ต์ •๋ ฌ์˜ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n²)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ”ผ๋ฒ— ์„ ํƒ์ด ํ•ญ์ƒ ์ตœ์•…์˜ ๊ฒฝ์šฐ(์˜ˆ: ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๋˜๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ)๋กœ ์ด๋ฃจ์–ด์งˆ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ถ„ํ•  ๋‹จ๊ณ„: ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐฐ์—ด์ด ํ•œ์ชฝ์œผ๋กœ๋งŒ ์น˜์šฐ์น˜๊ฒŒ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  2. ์žฌ๊ท€ ํ˜ธ์ถœ: ํ•œ์ชฝ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๊ณ„์† ์ค„์–ด๋“ค์ง€๋งŒ, ๋‹ค๋ฅธ ์ชฝ ๋ฐฐ์—ด์€ ๊ฑฐ์˜ ์›๋ž˜ ํฌ๊ธฐ์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  3. ๋ถ„ํ• ์˜ ๊นŠ์ด: ์ด ๊ฒฝ์šฐ ๋ถ„ํ• ์˜ ๊นŠ์ด๋Š” ์ตœ๋Œ€ n ๋‹จ๊ณ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  4. ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…๋Ÿ‰: ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋น„๊ตํ•˜๋ฏ€๋กœ, ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…๋Ÿ‰์€ O(n)์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์ตœ์•…์˜ ๊ฒฝ์šฐ n ๋‹จ๊ณ„์—์„œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค O(n)์˜ ์ž‘์—…๋Ÿ‰์ด ํ•„์š”ํ•˜์—ฌ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n²) ์ด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์„  ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)

ํ€ต์ •๋ ฌ์˜ ์ตœ์„  ์‹œ๊ฐ„ ๋ณต์žก๋„๋„ O(n log n)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ”ผ๋ฒ— ์„ ํƒ์ด ํ•ญ์ƒ ๋ฐฐ์—ด์„ ์ •ํ™•ํžˆ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋Š” ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

ํ€ต์ •๋ ฌ์˜ ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ O(log n) ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์˜ ๊นŠ์ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฉฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n) ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ‰๊ท  ๋ฐ ์ตœ์„ ์˜ ๊ฒฝ์šฐ: O(log n) (์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์˜ ๊นŠ์ด๊ฐ€ logโก n ์ด๊ธฐ ๋•Œ๋ฌธ).
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: O(n) (์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์˜ ๊นŠ์ด๊ฐ€ ์ตœ๋Œ€ n ์ด๊ธฐ ๋•Œ๋ฌธ).

๊ฒฐ๋ก 

  • ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  • ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n²)
  • ์ตœ์„  ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: ํ‰๊ท ์ ์œผ๋กœ O(log โกn), ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)
728x90
๋ฐ˜์‘ํ˜•