ํค์๋
- ๋ถํ ์ ๋ณต
- ํต ์ ๋ ฌ
- ๋ณํฉ ์ ๋ ฌ
๋ถํ ์ ๋ณต
- ๋ณต์กํ๊ฑฐ๋ ํฐ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฐฉ๋ฒ
- ๋ฌธ์ ๋ฅผ ๋๋์ด ๋ณ๋ ฌ์ ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ(๋จ, ๋ฌธ์ ํด๊ฒฐ์ ์ํด ํจ์๊ฐ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋ ์ ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ)
- ๋ถํ (Divide) : ๋ฌธ์ ๋ฅผ ์๊ฒ ์๊ฒ ๋๋๋ ๊ณผ์
- ์ ๋ณต(Conquer) : ์๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ํ๋์ฉ return ํ์ฌ ์ ๋ณต(ํน์ ๊ฐ์ ๋์ถ)
- ๋จผ์ Divide๋ฅผ ํ ํ ๊ทธ์ ์ญ์์ผ๋ก ์์ ๋ฌธ์ ๋ถํฐ ํ๋ํ๋ ์ ๋ณตํด์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ์ ๋์ถ
- ๋จ, ๊ณผ์ฐ ์ด ๋ฌธ์ ๋ฅผ ๋ถํ ์ ๋ณต์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ธ ๊ฒ์ด๋ ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค!
- ์๋๋ ์ฌ๊ท์ ๋ถํ ์ ๋ณต์ ์ฐจ์ด(๋ถํ ์ ๋ณต์ ๋ณดํต ์ฌ๊ทํจ์๋ฅผ ํ์ฉ)
[์ ๋ ฌ, ๋ถํ ์ ๋ณต] ํต ์ ๋ ฌ(Quick Sort)
- ํผ๋ฒ(pivot)์ด๋ผ๋ ๊ฐ์ ํน์ ์ง์ด์ฃผ๊ณ (๋ณดํต ๋ฐฐ์ด์ ๋งจ ์ ํน์ ๋งจ ๋ค ์ด์ฉ)
ํด๋น๊ฐ์ ์ผ์ชฝ์ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ, ์ค๋ฅธ์ชฝ์ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๋๋ฉฐ ๋ฐ๋ณต ํธ์ถ - ํ๊ท ์ ์ผ๋ก O(nlogn)์ด์ง๋ง, ์ต์ ์ ๊ฒฝ์ฐ O(n^2)
- ๋ถ์์ ์ ๋ ฌ๋ก์ ์ค๋ณต๋๋ ๊ฐ์ด ์กด์ฌํ ๋, ์ค๋ณต๊ฐ์ ๋ํ ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ค.(๋ฐ๋๋ก ์ค๋ณต๊ฐ์ ์์๊ฐ ์ ์ง๋๋ ๊ฑด ์์ ์ ๋ ฌ)
- ์ฑ๋ฅ์ด ์ฐ์ํ์ง๋ง, ์ฑ๋ฅ์ ํธ์ฐจ๊ฐ ํฌ๊ณ (์๊ฐ๋ณต์ก๋ ์) ํผ๋ฒ ์ค์ ์ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ด ์ ์ผ๋ก ์ค๋ฌด์์๋ ํ์ฉ๋๊ฐ ๋ฎ๋ค.
def quick_sort(li):
if len(li) <= 1:
return li
else:
pivot = li[0]
less = [left for left in li[1:] if left <= pivot]
great = [right for right in li[1:] if right > pivot]
return quick_sort(less) + [pivot] + quick_sort(great)
[์ ๋ ฌ, ๋ถํ ์ ๋ณต] ๋ณํฉ์ ๋ ฌ(Merge Sort)
- ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๊ฐ ํ๋๋ฐ์ ๋จ์ง ์์ ๋๊น์ง ๊ณ์ ๋๋ก ์ชผ๊ฐ ํ ๋ค์ ํฌ๊ธฐ ์์ผ๋ก ์ฌ๋ฐฐ์ดํ๋ฉด์ ์๋ ํฌ๊ธฐ์ ๋ฐฐ์ด๋ก ๊ฒฐํฉ
- ๋ถํ ํํธ : ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ ์์ ๋ฐฐ์ด๋ก ๋๋๋ ๊ณผ์ , ๋ ์ด์ ๋ถํ ํ ์ ์๋ ๊ฒฝ์ฐ ์ค์ง
def merge_sort(li):
if len(li) <= 1:
return li
else:
mid = len(li) // 2 ## ์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ฐ์ด๋ฐ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๊ณ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐฐ์ด ๋ถํ
left = merge_sort(li[:mid])
right = merge_sort(li[mid:])
return merge(left, right)
- ๊ฒฐํฉ ํํธ : ๋ณํฉ ์ ๋ ฌ์์ ํต์ฌ์ด ๋๋ ๊ณผ์ ์ผ๋ก, ๊ฒฐํฉ ํ๋ฉด์ ์ ๋ ฌ๋ ํจ๊ป ์งํ๋๋ค.
def merge(left, right):
merged_arr = [] # ๊ฒฐํฉ์ ์ํ ๋น ๋ฆฌ์คํธ ์์ฑ
i = j = 0 # ์ธ๋ฑ์ค๊ฐ ์ด๊ธฐํ๋ฅผ ์ํ ์ค์
while i < len(left) and j < len(right):
if left[i] < right[j]:
merged_arr.append(left[i])
i += 1
else:
merged_arr.append(right[j])
j += 1
merged_arr += left[i:]
merged_arr += right[j:] # while๋ฌธ์์ ์ฒ๋ฆฌ๋์ง ์์ ๊ฐ๋ค์ ๋ํด์ฃผ๋ ๊ณผ์
return merged_arr
๊ฐ์ธ์ ์ผ๋ก ๊ธฐ๋ณธ ์ ๋ ฌ(๋ฒ๋ธ, ์ฝ์
, ์ ํ) ๊ทธ๋ฆฌ๊ณ ๋ถํ ์ ๋ณต์ ํ์ฉํ ์ ๋ ฌ(ํต, ๋ณํฉ) ์ค ๋ณํฉ ์ ๋ ฌ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฐธ ์ ๊ธฐํ ๊ฒ ๊ฐ๋ค.
๊ฐ๋
์์ฒด๋ ๊ฐ๋จํ์ง๋ง ๋ณํฉ์ ๋ ฌ์ ํต์ฌ์ธ merge ๋ถ๋ถ์์ sorting์ด ๋จ๊ณผ ๋์์ merge๊ฐ ๋๋ ์๊ณ ๋ฆฌ์ฆ์์ ๋ง์ด ๋ฐฐ์ธ ์ ์์๋ค.
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 103. [์๋ฃ๊ตฌ์กฐ] ๊ทธ๋ํ (0) | 2022.04.12 |
---|---|
[TIL] 102. [์๋ฃ๊ตฌ์กฐ] ํด์ํ ์ด๋ธ (0) | 2022.04.11 |
[TIL] 100. [์๊ณ ๋ฆฌ์ฆ] ํ์ (0) | 2022.04.06 |
[TIL] 99. [์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ (0) | 2022.04.06 |
[TIL] 98. [์๋ฃ๊ตฌ์กฐ] ํธ๋ฆฌ (0) | 2022.04.05 |