Merge Sort (๋ณํฉ์ ๋ ฌ)
- ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ์ ๋ ์ด ์ ๋ ฌ์ ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ, ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ ์ค์ ํ๋์ด๋ค.
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ : ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ๋ค์, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ๋ต์ด๋ค. ๋๊ฐ ์ํํธ์ถ์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
- ํ๋์ ๋ฆฌ์คํธ๋ฅผ ๋ ๊ฐ์ ๊ท ๋ฑํ ํฌ๊ธฐ๋ก ๋ถํ ํ๊ณ ๋ถํ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋ค์, ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ํฉํ์ฌ ์ ์ฒด๊ฐ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๊ฐ ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
<๋ณํฉ ์ ๋ ฌ์ ๋จ๊ณ>
- ๋ถํ (Divide): ์
๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ ํฌ๊ธฐ์ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋ถํ ํ๋ค.
- ์ ๋ณต(Conquer): ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๋ถ๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ง ์์ผ๋ฉด ์ํ ํธ์ถ ์ ์ด์ฉํ์ฌ ๋ค์ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ค.
- ๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด์ ๋ณํฉํ๋ค.
Merge sort ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
์ฅ์ : ํฌ๊ธฐ๊ฐ ํฐ ๋ ์ฝ๋๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ ๊ฒฝ์ฐ ํจ์จ์ ์, ๋ฐ์ดํฐ ๋ถํฌ์ ์ํฅ์ ๋ ๋ฐ๋๋ค.
๋จ์ : ํฌ๊ธฐ๊ฐ ํฐ ๋ ์ฝ๋๋ค์ ๊ทธ๋ฅ ์ ๋ ฌํ ๊ฒฝ์ฐ ์๊ฐ ๋ญ๋น๊ฐ ์ฌํจ (์ฐ๊ฒฐ๋ฆฌ์คํธ ํ์ฉํ์ฌ ํด๊ฒฐ)
Python์ผ๋ก ๋ํ๋ธ Merge sort
#best : nlogn
#avg : nlogn
#worst : nlogn
def mergeSort(arr) :
if len(arr) > 1 :
mid = len(arr) // 2
L = arr[:mid]
R = arr[mid:]
mergeSort(L)
mergeSort(R)
i, j, k = 0, 0, 0
while i < len(L) and j < len(R) :
if L[i] < R[j] :
arr[k] = L[i]
i += 1
else :
arr[k] = R[j]
j += 1
k += 1
while i < len(L) :
arr[k] = L[i]
i += 1
k += 1
while j < len(R) :
arr[k] = R[j]
j += 1
k += 1
return arr
ll = [1, 2, 3, 2, 5, 6]
print(mergeSort(ll))
Quick sort (ํต์ ๋ ฌ)
- ํต ์ ๋ ฌ์ ๋ถ์์ ์ ๋ ฌ ์ ์ํ๋ฉฐ, ๋ค๋ฅธ ์์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต ์ ๋ ฌ ์ ์ํ๋ค.
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ : ๋ณํฉ ์ ๋ ฌ๊ณผ ๋ฌ๋ฆฌ ๋ฆฌ์คํธ๋ฅผ ๋น๊ท ๋ฑํ๊ฒ ๋ถํ ํ๋ค.
- ํ๋์ ๋ฆฌ์คํธ๋ฅผ ํผ๋ฒ(pivot)์ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ๋น๊ท ๋ฑํ ํฌ๊ธฐ๋ก ๋ถํ ํ๊ณ ๋ถํ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋ค์, ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ํฉํ์ฌ ์ ์ฒด๊ฐ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๊ฐ ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ํ ํธ์ถ์ด ํ๋ฒ ์งํ๋ ๋๋ง๋ค ์ต์ํ ํ๋์ ์์(ํผ๋ฒ)๋ ์ต์ข ์ ์ผ๋ก ์์น๊ฐ ์ ํด์ง๋ฏ๋ก, ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋์ ๋๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค
<ํต ์ ๋ ฌ์ ๋จ๊ณ>
- ๋ถํ (Divide): ์
๋ ฅ ๋ฐฐ์ด์ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋น๊ท ๋ฑํ๊ฒ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด(ํผ๋ฒ์ ์ค์ฌ์ผ๋ก ์ผ์ชฝ: ํผ๋ฒ๋ณด๋ค ์์ ์์๋ค, ์ค๋ฅธ์ชฝ: ํผ๋ฒ๋ณด๋ค ํฐ ์์๋ค)๋ก ๋ถํ ํ๋ค.
- ์ ๋ณต(Conquer): ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๋ถ๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ์์ง ์์ผ๋ฉด ์ํ ํธ์ถ ์ ์ด์ฉํ์ฌ ๋ค์ ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ค.
- ๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด์ ํฉ๋ณํ๋ค.
Quick sort ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
์ฅ์ : ์๋๊ฐ ๋น ๋ฅด๋ค. (๊ฐ์ฅ ๋น ๋ฆ)
๋จ์ : ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํด์๋ ํต ์ ๋ ฌ์ ๋ถ๊ท ํ ๋ถํ ์ ์ํด ์คํ๋ ค ์ํ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
Python์ผ๋ก ๋ํ๋ธ Quick sort
#quick sort
def partition(arr, low, high):
i = (low - 1)
pivot = arr[high]
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i+1], arr[high] = arr[high], arr[i+1]
return (i+1)
def quickSort(arr, low, high):
if len(arr) == 1:
return arr
if low < high:
pi = partition(arr, low, high)
quickSort(arr, low, pi-1)
quickSort(arr, pi+1, high)
def Quick(arr) :
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
less, equal, more = [], [], []
for num in arr:
if num < pivot:
less.append(num)
elif num > pivot:
more.append(num)
else:
equal.append(num)
return Quick(less) + equal + Quick(more)
[์ ํ, ์ฝ์ , ๋ฒ๋ธ ์ ๋ ฌ]