ํฐ์คํ ๋ฆฌ ๋ทฐ
ํต ์ ๋ ฌ
: ํน์ ๊ธฐ์ค ์์๋ฅผ ์ค์ฌ์ผ๋ก, ๊ธฐ์ค ์์๋ณด๋ค ์์ ๊ฒ๋ค์ ๊ธฐ์ค์ ์ผ์ชฝ์ผ๋ก, ๊ธฐ์ค ์์๋ณด๋ค ํฐ ๊ฒ๋ค์ ๊ธฐ์ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌ + ์ฌ๊ท์ ์ผ๋ก ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ ์ฌ์ฉ.
๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ๋ ํ๋ค.
ํต์ฌ ์๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋ Python ์ฝ๋
def quicksort(L):
if(len(L) == 1) or (len(L) == 0):
return L
pivot = L[0]
left = []
right = []
for x in L[1:]:
if (x < pivot):
left.append(x)
else:
right.append(x)
return quicksort(left) + [pivot] + quicksort(right)
์์ ์ฝ๋๋ ๊ธฐ์ค ์ ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ 0๋ฒ์งธ ์ธ๋ฑ์ค, ์ฆ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๊ณ ,
ํด๋น ๊ธฐ์ค ์์๋ณด๋ค ์์ ๊ฐ์ left์, ํด๋น ๊ธฐ์ค ์์๋ณด๋ค ํฐ ๊ฐ์ right์ ์ ์ฅํ ํ, ์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ์งํํ๊ณ ์๋ค.
์์ ์ฝ๋๋ ์ดํดํ๊ธฐ ์ฝ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ณ ๋ คํ์ง ์์ ์ฝ๋์ด๋ค.
left์ right ํฌ์ธํฐ 2๊ฐ๋ฅผ ์ด์ฉํด ํจ์จ์ ์ผ๋ก ํต ์ ๋ ฌ์ ์ํํ๋ Python Code๋ฅผ ์ฐธ๊ณ ํด๋ณด์.
์ดํด๊ฐ ์๋๋ค๋ฉด ๊ทธ ์๋ ํ ๋จ๊ณ ํ ๋จ๊ณ ์ด๋ป๊ฒ ์งํ๋๋์ง ์ง์ ์์ผ๋ก ์จ๋์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ๋์์ด ๋ง์ด ๋ ๊ฒ์ด๋ค.
from typing import List
def quickSort(data: List[int], left: int, right: int):
if(left >= right):
return
pivot = left # ๊ธฐ์ค๊ฐ
pl = left + 1 # pointer_left
pr = right # pointer_right
while(pl <= pr):
# pl๋ฒ์งธ ๊ฐ์ด ๊ธฐ์ค๊ฐ๋ณด๋ค ํฐ ๊ฐ์ด ๋์ฌ ๋๊น์ง pl์ ํ ์นธ์ฉ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
while(pl <= right and data[pl] <= data[pivot]):
pl += 1
# pr๋ฒ์งธ ๊ฐ์ด ๊ธฐ์ค๊ฐ๋ณด๋ค ์์ ๊ฐ์ด ๋์ฌ ๋๊น์ง pr์ ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋
while(pr > left and data[pr] >= data[pivot]):
pr -= 1
# pl์ pr๊ฐ ์๊ฐ๋ ธ๋ค๋ฉด ๊ธฐ์ค๊ฐ๊ณผ pr ๋ฒ์งธ ๊ฐ์ swap
if(pl > pr):
data[pr], data[pivot] = data[pivot], data[pr]
# pl ๋ฒ์งธ ๊ฐ๊ณผ pr ๋ฒ์งธ ๊ฐ์ swap, pl๊ณผ pr์ ๊ทธ๋๋ก ์์. ๊ฐ์ ๋ณ๊ฒฝ!
else:
data[pl], data[pr] = data[pr], data[pl]
# ์ฌ๊ท์ ์ผ๋ก ๊ธฐ์ค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฆฌ์คํธ์, ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค.
quickSort(data, left, pr-1)
quickSort(data, pr+1, right)
return data
[3, 7, 8, 1, 5, 9, 6, 10, 2, 4] ๋ฅผ ํต ์ ๋ ฌํ๋ Step by Step์ ์ ๋ฐ๋ผ์๋ณด์
์๊ฐ ๋ณต์ก๋
ํ๊ท : O(nlogn)
๊ฐ์ฅ ์ข์ ๊ฒฝ์ฐ: ๊ธฐ์ค์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๊ฐ์ ์์ ์์๊ฐ ์ด๋ํ ๋
T(n) = 2*T(n/2) + n
T(n) = O(nlogn)
๊ฐ์ฅ ๋์ ๊ฒฝ์ฐ: ๊ธฐ์ค์ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ ํ ์ชฝ์ผ๋ก๋ง ์์๊ฐ ์ ๋ฆผ
T(n) = T(n-1) + n
T(n) = O(n^2)
ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n log n)์ธ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ์ฐ์ ํต ์ ๋ ฌ์ ์๋ ์๋ฆฌ์ ๋ถํ -์ ๋ณต(divide-and-conquer) ์ ๋ต์ ๋ํด ์ดํดํด์ผ ํฉ๋๋ค.
ํต ์ ๋ ฌ์ ๋จผ์ ๋ฆฌ์คํธ๋ฅผ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ์์ ๋ฆฌ์คํธ๋ก ๋ถํ ํฉ๋๋ค. ์ด๋ฅผ ๋ถํ ๋จ๊ณ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ๊ณผ์ ์ O(n) ์๊ฐ์ด ์์๋๋ฉฐ, n์ ๋ฆฌ์คํธ์ ํฌ๊ธฐ์ ๋๋ค. ์๋ํ๋ฉด ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ ํ ๋ฒ์ฉ๋ง ๊ฒ์ฌํ๋ฉด ๋ฉ๋๋ค.
์ดํ ๊ฐ ํ์ ๋ฆฌ์คํธ์ ๋ํด ํต ์ ๋ ฌ์ ์ฌ๊ท์ ์ผ๋ก ์ํํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ถํ -์ ๋ณต ์ ๋ต์ ํต์ฌ์ ๋๋ค.
์ฌ๊ท ํธ์ถ์ ๊น์ด๋ ํผ๋ฒ์ ์ ํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ฉฐ, ์ด๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ log n์ด ๋ฉ๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ๋ ๊ฐ ๋จ๊ณ์์ ๋ฆฌ์คํธ๊ฐ ๋ ๋์ผํ ํฌ๊ธฐ์ ํ์ ๋ฆฌ์คํธ๋ก ๋ถํ ๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
๋ฐ๋ผ์, ๊ฐ ๋จ๊ณ์์ O(n)์ ์์ ์ ์ํํ๊ณ ์ด๋ฅผ log n ๋จ๊ณ์ ๊ฑธ์ณ ์ํํ๋ฏ๋ก, ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(n log n)์ด ๋ฉ๋๋ค.
๋จ, ์ด๊ฒ์ ์ต์ ์ ๊ฒฝ์ฐ๋ ํ๊ท ์ ์ธ ๊ฒฝ์ฐ์ ์๊ฐ ๋ณต์ก๋์ ๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ์๋ ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(n^2)์ด ๋ฉ๋๋ค. ์ด๋ ๊ฐ ๋ถํ ๋จ๊ณ์์ ํ๋์ ํ์ ๋ฆฌ์คํธ๊ฐ ๋น ๋ฆฌ์คํธ๊ฐ ๋๊ณ , ๋ค๋ฅธ ํ์ ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๊ฐ ํฌํจ๋๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ํต ์ ๋ ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒ๋ธ ์ ๋ ฌ์ด๋ ์ฝ์ ์ ๋ ฌ๊ณผ ๊ฐ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ต์ ์ ๊ฒฝ์ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ํผ๋ฒ ์ ํ ์ ๋ต์ ๋ฐ๋ผ ํฌ๊ฒ ํผํด๊ฐ ์ ์์ต๋๋ค.
'๐ง๐ปโ๐ป ์๊ณ ๋ฆฌ์ฆ > ์ ๋ ฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ ๋ ฌ] 7. ํ ์ด๋ ์ดํดํ๋ ๊ธฐ์ ์ ๋ ฌ(radix sort) (0) | 2022.11.30 |
---|---|
[์ ๋ ฌ] 6. ํ ์ ๋ ฌ (0) | 2022.11.30 |
[์ ๋ ฌ] 2. ์ ํ ์ ๋ ฌ (0) | 2022.11.30 |
[์ ๋ ฌ] 4.๋ณํฉ์ ๋ ฌ(Merge sort) (0) | 2022.11.29 |
[์ ๋ ฌ] 3.์ฝ์ ์ ๋ ฌ (0) | 2022.11.29 |
- Total
- Today
- Yesterday
- react
- ์๊ณ ๋ฆฌ์ฆ
- React Query
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ฆฌ์กํธ
- useState
- DB
- github
- ์๋ฌ
- ๋ธ๋ผ์ฐ์
- state
- ์ ๋ ฌ
- ํจ์
- Context API
- zustand
- ์๋ฃ๊ตฌ์กฐ
- Browser
- DOM
- error
- Component
- git
- BOJ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- mdn
- CSS
- leetcode
- JavaScript
- ํ์ด์ฌ
- ๊ทธ๋ํ
- Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |