Merge Sort
์ฌ๋ฌ ๊ฐ์ ์ ๋ ฌ๋ ์๋ฃ์ ์งํฉ์ ๋ณํฉํ์ฌ ํ ๊ฐ์ ์ ๋ ฌ๋ ์งํฉ์ผ๋ก ๋ง๋๋ ๋ฐฉ์
์ฐ๊ฒฐ list์ ๊ฒฝ์ฐ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ์!
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ ํ์ฉ
์๋ฃ๋ฅผ ์ต์ ๋จ์์ ๋ฌธ์ ๊น์ง ๋๋ ํ์ ์ฐจ๋ก๋๋ก ์ ๋ ฌํ์ฌ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋
top-down
๋ฐฉ์
์๊ฐ ๋ณต์ก๋
O(n log n)
๋ณํฉ ์ ๋ ฌ์ ๊ณผ์
๋ถํ ๋จ๊ณ
์ ์ฒด ์๋ฃ ์งํฉ์ ๋ํ์ฌ, ์ต์ ํฌ๊ธฐ์ ๋ถ๋ถ์งํฉ์ด ๋ ๋๊น์ง ๋ถํ ์์ ์ ๊ณ์ํจ
๋ณํฉ ๋จ๊ณ
2๊ฐ์ ๋ถ๋ถ์งํฉ์ ์ ๋ ฌํ๋ฉด์ ํ๋์ ์งํฉ์ผ๋ก ๋ณํฉ
๋ถํ ๊ณผ์ ์ ์๊ณ ๋ฆฌ์ฆ
def merge_sort(m):
if len(m) <= 1: #size๊ฐ 0์ด๊ฑฐ๋ 1์ธ ๊ฒฝ์ฐ ๋ฐ๋ก return
return m
# 1. Divide ๋ถ๋ถ
mid = len(m)//2
left = m[:mid]
right = m[mid:]
#list์ ํฌ๊ธฐ๊ฐ 1์ด ๋ ๋๊น์ง merge_sort ์ฌ๊ท ํธ์ถ
left = merge_sort(left)
right = merge_sort(right)
# 2. Conquer ๋ถ๋ถ: ๋ถํ ๋ list๋ค ๋ณํฉ
ruturn merge(left, right)
๋ณํฉ ๊ณผ์ ์ ์๊ณ ๋ฆฌ์ฆ
def merge(left, right):
result = [] #๋ ๊ฐ์ ๋ถํ ๋ list๋ฅผ ๋ณํฉํ์ฌ result๋ฅผ ๋ง๋ฆ
while len(left) > 0 and len(right) >0: #์์ชฝ list์ ์์๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ
#๋ sub list์ ์ฒซ ์์๋ค์ ๋น๊ตํ์ฌ ์์ ๊ฒ๋ถํฐ result์ ์ถ๊ฐํจ
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if len(left) > 0: #์ผ์ชฝ list์ ์์๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ
result.extend(left)
if len(right) > 0: #์ค๋ฅธ์ชฝ list์ ์์๊ฐ ๋จ์์๋ ๊ฒฝ์ฐ
result.extend(right)
return result
Last updated
Was this helpful?