๋ณํฉ ์ ๋ ฌ(Merge Sort)
์ ๋ ฌ ์์
- ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ณธ๋ค.
- ๋ถํ (divide) : ์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ์๋ผ ๋ ๋ฐฐ์ด๋ก ๋๋๋ค.
- ์ ๋ณต(conquer) : ๋๋ ์ง ๋ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ๋ณํฉ์ ๋ ฌ์ ์ฌ์ฉํด์ ์ ๋ ฌํ๋ค.
- ๊ฒฐํฉ(combine) : ๋ ๋ฐฐ์ด์ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด๋ก ํฉ๋ณํ๋ค.
๋ถํ ์ ๋ณต(divide and conquer)๊ธฐ๋ฒ๊ณผ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค.
์ํ ๊ณผ์ ์์
๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์ด ์๋ค.
[6, 5, 3, 1, 8, 7, 2, 4]
์ ๋ฐ์ผ๋ก ์๋ผ ๋ ๋ฐฐ์ด๋ก ๋๋๋ค.
[6, 5, 3, 1] [8, 7, 2, 4]
๋ค์ ๋ ๋ฐฐ์ด์ ๋๋ ๋ค ๊ฐ๋ก ๋๋๋ค.
[6, 5] [3, 1] [8, 7] [2, 4]
๋ง์ง๋ง์ผ๋ก ๋ค ๊ฐ์ ๋ฐฐ์ด์ ์ฌ๋ ๊ฐ๋ก ๋๋๋ค.
[6] [5] [3] [1] [8] [7] [2] [4]
๋ ์ด์ ๋๋ ์ ์์ผ๋ ๋ ๊ฐ์ฉ ํฉ์น๋ค. ํฉ์น ๋ ์์์๊ฐ ์์ ๋์ค๋๋ก ํฉ์น๋ค.
[5, 6] [1, 3] [7, 8] [2, 4]
[1, 3, 5, 6] [2, 4, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
์๊ฐ๋ณต์ก๋
O(NlogN)
์ฝ๋
def merge_sort(l):
n=len(l)
if n<=1:
return
mid=n//2
left_list=l[:mid]
right_list=l[mid:]
merge_sort(left_list)
merge_sort(right_list)
i=j=0
now=0
while i<len(left_list) and j<len(right_list):
if left_list[i]<right_list[j]:
l[now]=left_list[i]
now+=1
i+=1
else:
l[now]=right_list[j]
now+=1
j+=1
while i<len(left_list):
l[now]=left_list[i]
now+=1
i+=1
while j<len(right_list):
l[now]=right_list[j]
now+=1
j+=1
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 11729๋ฒ-ํ์ด์ฌ]ํ๋ ธ์ด ํ ์ด๋ ์์ (0) | 2023.06.19 |
---|---|
[์๊ณ ๋ฆฌ์ฆ]์ต๋ ๊ณต์ฝ์(GCD) ์๊ณ ๋ฆฌ์ฆ - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.06.19 |
์นด์ดํ ์ ๋ ฌ(Counting Sort)Permalink (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]์๊ฐ๋ณต์ก๋ (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]Recursion ์์ฉ(๋ฏธ๋ก์ฐพ๊ธฐ) (0) | 2023.06.19 |