ํต ์ ๋ ฌ์ ๋ณํฉ์ ๋ ฌ๊ณผ ๋น์ทํ๊ฒ
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ
์ ๋๋ค.
ํ๊ท ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํ๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ฆฌ์คํธ ์์ ์๋ ํ ์์๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ ๊ฒ ๊ณ ๋ฅธ ์์๋ฅผ
pivot(ํผ๋ฒ)
์ด๋ผ๊ณ ํฉ๋๋ค. (์ ํ ํ ์์์ ๋ฐ๋ผ ์๋๊ฐ ๋ฌ๋ผ์ง๋๋ค) - pivot์ ๊ธฐ์ค์ผ๋ก pivot๋ณด๋ค ์์ ์์๋ค์ ๋ชจ๋ pivot์ ์ผ์ชฝ์ผ๋ก ์ฎ๊ธฐ๊ณ , pivot๋ณด๋ค ํฐ ์์๋ค์ ๋ชจ๋ pivot์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊น๋๋ค.
- pivot์ ์ ์ธํ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ์ ๋ ฌํฉ๋๋ค.
- ๋ถํ ๋ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ ๋ค์ pivot์ ์ ํ๊ณ pivot์ ๊ธฐ์ค์ผ๋ก 2๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ๋๋๋๋ค.
- ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ถ ๋ฆฌ์คํธ๋ค์ด ๋ ์ด์ ๋ถํ ์ด ๋ถ๊ฐ๋ฅ ํ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
-
๊ณต๊ฐ ๋ณต์ก๋
- ์ฃผ์ด์ง ๋ฐฐ์ด ์์์ ๊ตํ(swap)์ ํตํด, ์ ๋ ฌ์ด ์ํ๋๋ฏ๋ก O(n)์ ๋๋ค.
-
์๊ฐ ๋ณต์ก๋
- ๋ ๊ทธ๋ฃน์ผ๋ก ๋ถํ ํ๋๋ฐ
O(N)
์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ ๋ถํ ๋ ๋จ๊ณ๋ฅผO(logN)
๋งํผ ์ํํ๋ฏ๋ก ํ๊ท ์๊ฐ ๋ณต์ก๋๋O(NlogN)
์ ๋๋ค. - ๋ถํ ํ ๊ฒฐ๊ณผ๊ฐ ํ์ชฝ์ผ๋ก ๋ชฐ๋ฆฌ๋ ์ต์
์ ๊ฒฝ์ฐ์๋
O(nยฒ)
์ ๋๋ค.
- ๋ ๊ทธ๋ฃน์ผ๋ก ๋ถํ ํ๋๋ฐ
- ํ๊ท ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ
๋๋ค.
- ์๊ฐ ๋ณต์ก๋๊ฐ O(NlogN)์ ๊ฐ์ง๋ ๋ค๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๊ตํ์ ๋๋ ๊ฐ์ฅ ๋น ๋ฆ ๋๋ค.
- ๋ฐฐ์ด ์์์ ์์น๋ง ๊ตํํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์์ต๋๋ค.
- ์ค๋ณต๋ ํค๊ฐ์ด ์์๋๋ก ๋ฐ๋์ง ์์ ์ ์์ด
not-stable(๋ถ์์ )
ํ ์ ๋ ฌ์ ๋๋ค. - ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์์๋ ์คํ๋ ค ์ํ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋จ์ ์ด ์์ต๋๋ค.
๋ฌธ์
ํ์ด
์
๋ ฅ ๊ฐ๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๋ฌธ์ ์
๋๋ค.
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ ๋ ฌํฉ๋๋ค.
def quick_sort(arr):
def sort(low, high):
if high <= low:
return
mid = partition(low, high)
sort(low, mid - 1)
sort(mid, high)
def partition(low, high):
pivot = arr[(low + high) // 2]
while low <= high:
while arr[low] < pivot:
low += 1
while arr[high] > pivot:
high -= 1
if low <= high:
arr[low], arr[high] = arr[high], arr[low]
low += 1
high -= 1
return low
return sort(0, len(arr) - 1)
n = int(input())
numbers = []
for _ in range(n):
numbers.append(int(input()))
quick_sort(numbers)
for n in numbers:
print(n)
- ๋ฆฌ์คํธ์ ์ ๊ฐ์ด๋ฐ ์๋ ๊ฐ์ pivot ๊ฐ์ผ๋ก ์ ํํฉ๋๋ค.
- ์์ ์ธ๋ฑ์ค(low)๋ ๊ณ์ ์ฆ๊ฐ์ํค๊ณ , ๋ ์ธ๋ฑ์ค(high)๋ ๊ณ์ ๊ฐ์์ํค๊ธฐ ์ํ while๋ฃจํ๋ฅผ ๋ ์ธ๋ฑ์ค๊ฐ ์๋ก ๊ต์ฐจํด์ ์ง๋์น ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
- ์์ ์ธ๋ฑ์ค(low)๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ๊ณผ pivot ๊ฐ์ ๋น๊ตํด์ ๋ ์์ ๊ฒฝ์ฐ ๋ฐ๋ณตํด์ ์์ ์ธ๋ฑ์ค ๊ฐ์ ์ฆ๊ฐ์ํต๋๋ค. (pivot ๊ฐ๋ณด๋ค ํฐ๋ฐ ์ข์ธก์ ์๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด)
- ๋ ์ธ๋ฑ์ค(high)๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ๊ณผ pivot๊ฐ์ ๋น๊ตํด์ ๋ ํฐ ๊ฒฝ์ฐ ๋ฐ๋ณตํด์ ๋ ์ธ๋ฑ์ค ๊ฐ์ ๊ฐ์์ํต๋๋ค. (pivot ๊ฐ๋ณด๋ค ์์๋ฐ ์ฐ์ธก์ ์๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด)
- ๋ ์ธ๋ฑ์ค๊ฐ ์์ง ์๋ก ๊ต์ฐจํด์ ์ง๋์น์ง ์์๋ค๋ฉด ์์ ์ธ๋ฑ์ค(low)๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ๊ณผ ๋ ์ธ๋ฑ์ค(high)๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ํธ ๊ต๋(swap)์ํต๋๋ค. (์๋ชป๋ ์์น์ ์๋ ๋ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด)
- ์ํธ ๊ต๋ ํ, ๋ค์ ๊ฐ์ ๊ฐ๋ฆฌํค๊ธฐ ์ํด ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ์งํ ๋ฐฉํฅ์ผ๋ก ํ ์นธ์ฉ ์ด๋ ์ํต๋๋ค.
- ๋ ์ธ๋ฑ์ค๊ฐ ์๋ก ๊ต์ฐจํด์ ์ง๋์น๊ฒ ๋์ด while ๋ฃจํ๋ฅผ ๋น ์ ธ๋์๋ค๋ฉด ๋ค์ ์ฌ๊ท ํธ์ถ์ ๋ถํ ๊ธฐ์ค์ ์ด ๋ ์์ ์ธ๋ฑ์ค๋ฅผ ๋ฆฌํดํฉ๋๋ค.