Merge Sort(ํฉ๋ณ์ ๋ ฌ)๋ Divide and Conquer(๋ถํ ์ ๋ณต)
์๊ณ ๋ฆฌ์ฆ ์ข
๋ฅ์ค ํ๋์ด๋ค. ๋ถํ ์ ๋ณต์ด๋ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ sub ๋ฌธ์ ๋ค๋ก ๋๋ ๋ค์์ ๊ทธ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ๋ค์์ ํฉ์น๋ ๊ฒ์ ์๋ฏธํ๋ค.
Pseudo-code ์ค๋ช
Merge-sort์ Merge parameter์์ A
๋ ์ ๋ ฌ์ด ํ์ํ list์ด๋ค. p
๋ list์ ๊ฐ์ฅ ์ index, q
๋ list์ ์ค๊ฐ index, r
์ list์ ๋ง์ง๋ง index๋ฅผ ์๋ฏธํ๋ค.
Merge Sort
: ์ด ํจ์๋ ์ ๋ ฌ๋์ง ์์ list๋ฅผ ๋ถํ ํ๋ ์ญํ ์ ํ๋ค
- p<r ์ด๋ฉด, ์์ง ์ ๋ ฌ์ด ์์ฑ๋์ง ์์ ์ํ๋ผ๊ณ ๊ฐ์ฃผํด์, p์ r์ ์ค๊ฐ์ธ q๋ฅผ ๊ตฌํ๋ค
- (p~q), (q+1~r) ๋ก list๋ฅผ ๋ถํ ํ๊ณ merge ํจ์์ ๋ณด๋ธ๋ค.
Merge
: ์ด ํจ์๋ ๋ถํ ๋ list๋ฅผ ํฉ๋ณํ๋ ์ญํ ์ ํ๋ค.
- 1~2๋ผ์ธ: n1์ ๋ถํ ๋ ์ผ์ชฝ list์ ๊ธธ์ด์ด๊ณ n2๋ ๋ถํ ๋ ์ค๋ฅธ์ชฝ list์ ๊ธธ์ด์ด๋ค.
- 3~7๋ผ์ธ: ๊ทธ ๋ค์์ L๊ณผ R์ ๊ธธ์ด๋งํผ ์ ์ธํด์ค ๋ค์์ ์ ๋ ฌ๋์ง ์๋ list์์ ํด๋น index๋ฅผ ๋ฐ์์์ L๊ณผ R์ ์ฑ์์ค๋ค.
- 8~11๋ผ์ธ: pseudo-code์์๋ 1์ด ๊ฐ์ฅ ์ฒซ index๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ i,j = 1๋ก ์ค์ ๋์๋ค.
- 12~17๋ผ์ธ: L๊ณผ R์ item๋ค์ ๋น๊ตํ๊ณ ๋ ์์ ๊ฐ์ ๊ธฐ์กด list์ ์ผ์ชฝ์, ๋ ํฐ ๊ฐ์ list์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์น๋ฅผ ํ๋ค.
source: merge-sort
๊ทธ๋ฆผ์ ๋ณด๋ฉฐ step๋ค์ ํ๋์ฉ ๋ฐ๋ผ๊ฐ๋ณด์
step1 - ์ ์ฒด list๋ฅผ ๋ถํ ํ๋ค.
step2 - p<r์ด๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ list ๋ค์ ๋ถํ ํ๋ค
step3 - p<r์ด๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ list ๋ค์ ๋ถํ ํ๋ค
step4~6 - ๋ถํ ๋ list๋ฅผ ๋ณํฉํ๋ค. ๋์ ๋น๊ตํ๊ณ ๋ ์์ ๊ฐ์ ์ผ์ชฝ์ ์์น ์ํจ๋ค.
step 7 - ์ด์ merge๊ฐ ๋๋ฌ์ผ๋ ์์ recursion์ผ๋ก ๋์๊ฐ์ ์ค๋ฅธ์ชฝ list๋ฅผ ๋ถํ ํ๋ค.
step8~10 - ๋ถํ ๋ list๋ฅผ ํฉ๋ณํ๋ค. ๋์ ๋น๊ตํ๊ณ ๋ ์์ ๊ฐ์ ์ผ์ชฝ์ ์์น ์ํจ๋ค.
step 11 - ์ด ๋ถ๋ถ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ฝ๋๋ก ์ดํด๋ณด์.
while i < len(L) and j < len(R):
if L[i] < R[j]:
num[k] = L[i]
i+=1
else:
num[k] = R[j]
j+=1
k+=1
[27,38] [3,43] ์ ๋ณํฉํ๋ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด, ๊ฐ๊ฐ list์ ์ฒซ์ธ์๋ฅผ ๋ณด๊ณ ๋น๊ต๋ฅผ ํ๋ค.
- 3์ด ๋ ์์ผ๋ [3] ์ด ๋จผ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- ๊ทธ ๋ค์์ 27๊ณผ 43์ ๋น๊ตํ๊ณ 27์ด ๋ ์์๋ [3,27]์ด ๋๋ค.
- ๊ทธ ๋ค์์๋ 38๊ณผ 43์ ๋น๊ตํ๊ณ 38์ด ๋ ์์๋ [3, 27, 38] ์ด ๋๋ค.
- ํ์ง๋ง ์ด์ i๊ฐ 2๊ฐ ๋์ด์ len(L)๊ณผ ๊ฐ์์ก๊ธฐ ๋๋ฌธ์ while๋ฌธ์ ๋น ์ ธ ๋์ค๊ฒ ๋๋ค.
์ด๋ ๋๋จธ์ง 43์ ๋ง๋ถํ๊ธฐ ์ํด์๋ ๋ฐ์ ์ฝ๋๋ค์ด ํ์ํ๋ค. ์ซ์๊ฐ ๋จ์๋ค๋ ๊ฒ์ ๋ค๋ฅธ ์ซ์๋ค ๋ณด๋ค ๊ฐ์ด ์ปธ๋ค๋ ์๋ฏธ์ด๋ค. ๊ทธ๋์ ๋จ์ ๊ธธ์ด๋งํผ ๊ธฐ์กด list์ ๋ถํ์ [3, 27, 38, 43] ์ด ๋๋ ๊ฒ์ด๋ค.
while i < len(L):
num[k] = L[i]
i+=1
k+=1
while j < len(R):
num[k] = R[j]
j+=1
k+=1
๊ทธ ์ดํ๋ก ๋ค์ ์์ recursion์ผ๋ก ๋์๊ฐ์ ๋๊ฐ์ ์์ ์ ์งํํ๋ค.
Python Code
์์ pseudo-code์๋ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑ์ ํ๋ค. ์ด์ ์๋ ํจ์ 2๊ฐ๋ฅผ ๋ง๋ค์ด์ recursion์ผ๋ก ํ์ง๋ง, ํ๋์ ํจ์๋ก ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค.
import random
def merge_sort(num):
if len(num) >1:
mid = len(num)//2 # list์ ์ค๊ฐ์ ์ฐพ๋๋ค
L = num[:mid] # list์ ์ผ์ชฝ์ ๋ถํ ํ๋ค
R = num[mid:] # list์ ์ค๋ฅธ์ชฝ์ ๋ถํ ํ๋ค
merge_sort(L) # ์ผ์ชฝ list๋ฅผ ์ ๋ ฌํ๋ค
merge_sort(R) # ์ค๋ฅธ์ชฝ list๋ฅผ ์ ๋ ฌํ๋ค
i = j = k = 0
# ์ผ์์ ์ผ๋ก ๋ง๋ L๊ณผ R์ ๋น๊ตํ๋ค
while i < len(L) and j < len(R):
if L[i] < R[j]: # ์ผ์ชฝ list์ ์๋ item์ด ๋ ์์ผ๋ฉด L[i]๋ฅผ list ์ผ์ชฝ์ ์์นํ๊ฒ ํ๋ค
num[k] = L[i]
i+=1
else: # ์ค๋ฅธ์ชฝ list์ ์๋ item์ด ๋ ์์ผ๋ฉด R[j]๋ฅผ list ์ผ์ชฝ์ ์์นํ๊ฒ ํ๋ค
num[k] = R[j]
j+=1
k+=1
# ์์ len(L) and len(R)์ด์๊ธฐ ๋๋ฌธ์, ๋ ๊ธด list์ ์ซ์๊ฐ ๋จ์์ ๊ฒ์ด๋ค,
# ๊ทธ ์ซ์๋ค์ ์ด์ด ๋ถํ๋ค.
# ๋จ์ ์ซ์๋ค์ ํฌ๊ธฐ ๋๋ฌธ์ ๋จ์ ๊ฒ์ด๊ธฐ์ ์ค๋ฅธ์ชฝ์ ๋ถํ์ง๋ค
while i < len(L):
num[k] = L[i]
i+=1
k+=1
while j < len(R):
num[k] = R[j]
j+=1
k+=1
number = [i for i in range(10)]
random.shuffle(number)
print(number)
merge = merge_sort(number)
print(number)