Table of Contents
quick sort๋ ๋ง ๊ทธ๋๋ก ๋น ๋ฅธ ์ ๋ ฌ์ ์๋ฏธํ๋ค. ํฐ ๋ฌธ์ ๋ฅผ ์ชผ๊ฐ ์์ ๋ฌธ์ ๋ก ๋ง๋ค์ด์ ์ ๋ณตํ๋ divide-and-conquer ํจ๋ฌ๋ค์์ ๋ฐํ์ ๋๊ณ ์์ด ํผํฌ๋จผ์ค๊ฐ ์ข๋ค.
https://idea-instructions.com/quick-sort/
๊ธฐ๋ณธ์ ์ธ ๋งค์ปค๋์ฆ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๋ค.
- ๋ฆฌ์คํธ์์ ๊ฐ ํ๋๋ฅผ ๊ณจ๋ผ pivot์ผ๋ก ์ ํ๋ค.
- pivot๋ณด๋ค ์์ ๊ฒ์ pivot์ ์ผ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
- pivot๋ณด๋ค ํฐ ๊ฒ์ pivot์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
- pivot์ ์ผ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๋ pivot์ ์ ํ๊ณ , pivot๋ณด๋ค ์์ ๊ฒ์ ์ผ์ชฝ, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ด๋ํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- pivot์ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๋ pivot์ ์ ํ๊ณ pivot๋ณด๋ค ์์ ๊ฒ์ ์ผ์ชฝ, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ด๋ํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณตํ๋ฉด ๋ฆฌ์คํธ์ ๊ฐ๋ค์ด ์ ๋ ฌ๋๋ค. ๋จ๊ณ์ ์ผ๋ก ์ดํด๋ณด๋ฉด ์ด๋ ๋ค.
# input
[85, 24, 63, 45, 17, 31, 96, 50]
# 50์ pivot์ผ๋ก ์ ํ๋ค.
[85, 24, 63, 45, 17, 31, 96, "50"]
# pivot(50)๋ณด๋ค ์์ ๊ฒ์ pivot์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
[24, 45, 17, 31, "50", 85, 63, 96]
# pivot(50)์ ์ผ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , 31์ pivot์ผ๋ก ์ ํ๋ค.
[_, _, _, _, "50", 85, 63, 96]
[24, 45, 17, "31"]
# pivot(31)๋ณด๋ค ์์ ๊ฒ์ pivot(31)์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
[_, _, _, _, "50", 85, 63, 96]
[24, 17, "31", 45]
# pivot(31)์ ์ผ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , 17์ pivot์ผ๋ก ์ ํ๋ค.
[_, _, _, _, "50", 85, 63, 96]
[_, _, "31", 45]
[24, "17"]
# pivot(17)๋ณด๋ค ์์ ๊ฒ์ pivot(17)์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
[_, _, _, _, "50", 85, 63, 96]
[_, _, "31", 45]
["17", 24]
# pivot(17)์ ์ผ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค. (์ผ์ชฝ์ ๊ฐ์ด ์์ผ๋ฏ๋ก ํจ์ค)
[_, _, _, _, "50", 85, 63, 96]
[_, _, "31", 45]
["17", 24]
[]
# pivot(17)์ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค. (๊ฐ์ด ํ๋์ด๋ฏ๋ก ํจ์ค)
[_, _, _, _, "50", 85, 63, 96]
[_, _, "31", 45]
["17", _]
[] [24]
# ๋ฆฌ์คํธ๋ฅผ pivot(17) ์ค๋ฅธ์ชฝ์ ๋ฃ๋๋ค. (ํธ์ถํ ๊ฐ์ด return๋๋ ๊ณผ์ )
[_, _, _, _, "50", 85, 63, 96]
[_, _, "31", 45]
["17", 24]
[] [_]
# ๋ฆฌ์คํธ๋ฅผ pivot(31) ์ผ์ชฝ์ ๋ฃ๋๋ค. (ํธ์ถํ ๊ฐ์ด return๋๋ ๊ณผ์ )
[_, _, _, _, "50", 85, 63, 96]
[17, 24, "31", 45]
[_, _]
[] [_]
# pivot(31)์ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ๋ค๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค. (๊ฐ์ด ํ๋์ด๋ฏ๋ก ํจ์ค)
[_, _, _, _, "50", 85, 63, 96]
[17, 24, "31", 45]
[_, _] [45]
[] [_]
# ๋ฆฌ์คํธ๋ฅผ pivot(31) ์ค๋ฅธ์ชฝ์ ๋ฃ๋๋ค. (ํธ์ถํ ๊ฐ์ด return๋๋ ๊ณผ์ )
[_, _, _, _, "50", 85, 63, 96]
[17, 24, "31", 45]
[_, _] [_]
[] [_]
# ๋ฆฌ์คํธ๋ฅผ pivot(50) ์ผ์ชฝ์ ๋ฃ๋๋ค. (ํธ์ถํ ๊ฐ์ด return๋๋ ๊ณผ์ )
[17, 24, 31, 45, "50", 85, 63, 96]
[_, _, _, _]
[_, _] [_]
[] [_]
# ์ ๊ณผ์ ์ pivot(50)์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ๋ํด ๋ฐ๋ณตํ๋ค.
[17, 24, 31, 45, "50", 63, 85, 96]
[_, _, _, _] [_, _, _]
[_, _] [_] [_, _] []
[] [_] [_] []
# output
[17, 24, 31, 45, 50, 63, 85, 96]
์ฌ๊ธฐ์๋ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๊ฐ์ ํญ์ pivot์ผ๋ก ์ ํ์ง๋ง, randomํ๊ฒ pivot์ ์ ํ ์๋ ์๊ณ , ์ค์๊ฐ์ pivot์ผ๋ก ์ ํ ์๋ ์๋ค. ์ค์๊ฐ์ pivot์ผ๋ก ์ ํ๋ ์ ๋ ฌ ๊ณผ์ ์ ์๊ฐํํ๋ฉด ์ด ์์์ฒ๋ผ ๋ณด์ธ๋ค. (quick sort๋ฅผ ์ดํดํ๋ ๋ฐ ๋ณ๋ก ๋์์ ์ ๋์ง๋ง ์ฌ๋ฐ๋ค.)
๊ทธ๋ฆฌ๊ณ ์ข ๋ ์ต์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก inplace quick sort๋ฅผ ์ธ ์ ์๋ค. inplace ๋ฐฉ์์ pivot์ ์ ํ๊ณ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ค์ ์ด๋์ํค๋ ๊ณผ์ ์ ๊ฐ์ ํ ๊ฒ์ด๋ค.
- ๋จผ์ ์ผ์ชฝ์์ ์ถ๋ฐํ๋ ์ธ๋ฑ์ค
l
๊ณผ ์ค๋ฅธ์ชฝ์์ ์ถ๋ฐํ๋ ์ธ๋ฑ์คr
์ ๋ง๋ ๋ค. l
์ pivot๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋๋ฉด ์ ์งํ๊ณ ,r
์ pivot๋ณด๋ค ์์ ๊ฐ์ ๋ง๋๋ฉด ์ ์งํ๋ค.- ๋ ์ธ๋ฑ์ค๊ฐ ๋ชจ๋ ์ ์งํ๋ฉด ๊ฐ์ ๊ต์ฒดํ๋ค.
- ์ด ๊ณผ์ ์
l
๊ณผr
์ด ๊ฐ์์ง ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์ด๋ฐ ์์ผ๋ก ๊ตฌํํ๋ฉด ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
# pivot = 50
# l = 85, r = 96, (l > pivot)
["85", 24, 63, 45, 17, 31, "96", "50"]
# l = 85, r = 31, (l > pivot) (r < pivot)
["85", 24, 63, 45, 17, "31", 96, "50"]
# l๊ณผ r์ ๊ต์ฒด
["31", 24, 63, 45, 17, "85", 96, "50"]
# l = 24, r = 17, (r < pivot)
[31, "24", 63, 45, "17", 85, 96, "50"]
# l = 63, r = 17 (l > pivot) (r < pivot)
[31, 24, "63", 45, "17", 85, 96, "50"]
# l๊ณผ r์ ๊ต์ฒด
[31, 24, "17", 45, "63", 85, 96, "50"]
# l = 45, r = 45 (l == r)
[31, 24, 17, "45", 63, 85, 96, "50"]
# l(45)๊ณผ r(45)์ด pivot๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฏ๋ก l += 1
# l = 63, r = 45
[31, 24, 17, "45", "63", 85, 96, "50"]
# l๊ณผ pivot์ ๊ต์ฒด
[31, 24, 17, 45, "50", 85, 96, 63]
ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def quick_sort(S, a, b):
if a >= b:
return
pivot = S[b]
left = a
right = b - 1
while left <= right:
while left <= right and S[left] < pivot:
left += 1
while left <= right and pivot < S[right]:
right -= 1
if left <= right:
S[left], S[right] = S[right], S[left]
left, right = left + 1, right - 1
S[left], S[b] = S[b], S[left]
quick_sort(S, a, left - 1)
quick_sort(S, left + 1, b)
์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ๋ฆฌ์คํธ๋ฅผ quick sort๋ก ์ ๋ ฌํ๋ ๊ฒฝ์ฐ