๋ช ๋ฒ์ ํด๋ ๋งค๋ฒ ์ด๋ฉด๊ฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ... ์ธ์ ๊ฐ ์ต์ํด์ง๊ฒ ์ง..
์ต๊ทผ ๋ช ๊ฐ์ ๋ฉด์ ์๊ธฐ์์ ๋ํผ๋ฐ์ค ์์ด ๊ตฌํํ ์ ์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌป๋ ๊ฒฝ์ฐ๋ฅผ ๋ดค๋ค. ๋๋ ๋ญ๋ผ๊ณ ๋๋ตํ ๊น? ๋ฒ๋ธ, ์ ํ, ์ฝ์ ์ ๋..?
์ด๋ผํ๋ค... ๋ค์ ์์๋ณด๊ณ ๋ .. ๋ ์์๋ณด์..
์ฝ์ ์ ๋ ฌ์ ์์ผ๋ก ๋์๊ฐ๋ฉด์ ์ ์ ์ ๋ ฌ ํด๊ฐ๋ ๋ฐฉ์์ด๋ค.
์ฒซ๋ฒ์งธ ๋ฐ๋ณต์์ ๋๋ฒ์งธ ์์์ ์๋ฆฌ๋ฅผ ์ก๋๋ค.
์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ๋ฅผ ๋น๊ต!
๋๋ฒ์งธ ๋ฐ๋ณต์์ ์ธ๋ฒ์งธ ์์์ ์๋ฆฌ๋ฅผ ์ก๋๋ค.
์ธ๋ฒ์งธ๋ถํฐ ๋๋ฒ์งธ ์ฒซ๋ฒ์งธ ์ญ ๋น๊ตํ๋ฉฐ ์ผ์ชฝ์ ๊ฐ์ด ๋ ํด ๋๊น์ง ์ด๋ํ๋ฉด์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
์ด๋ฅผ ๋ฐ๋ณตํ๋ฉด n๋ฒ ๋ฐ๋ณต๋ง๋ค n+1๊ฐ์ ์์๋ฅผ ์ ๋ ฌํ ์ ์๋ค.
์๊ฐ๋ณต์ก๋๋ ๋ฒ๋ธ์ ๋ ฌ๊ณผ ๋์ผํ O(N) ์ด์ง๋ง ์๋ฆฌ๋ฅผ ์ก์์ ๋ break ๋ฌธ์ผ๋ก ํ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฒ๋ธ์ ๋ ฌ ๋ณด๋ค๋ ์ข์ ์ฑ๋ฅ์ ๊ฐ๋๋ค.
def insertion_sort(arr):
n = len(arr)
for i in range(1, n):
min_idx = i
for j in range(i):
if arr[i-j] < arr[i-j-1]:
arr[i-j], arr[i-j-1] = arr[i-j-1], arr[i-j]
else:
break
๋ณํฉ์ ๋ ฌ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.
๋ถํ
ํ๋ ๋ถ๋ถ๊ณผ ๋ณํฉ
ํ๋ ๋ ๋ถ๋ถ์ด๋ค.
๋จผ์ ๋ถํ ํ๋ ๋ถ๋ถ์ ์ดํด๋ณด์.
์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฐฐ์ด์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ ๊ณ์ ์ ๋ฐ์ฉ ์๋ผ๊ฐ๋ฉฐ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ป์ ๋๊น์ง ๋ฐ๋ณตํ๋ค. ์ฌ๊ธฐ์ ์ป์ ์ ์๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ธ ๋ฐฐ์ด์ด๋ค.
๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ด ๋ ๋๊น์ง ๋ถํ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ๊ฒ์ด๋ค.
def devide(arr):
n = len(arr)
if n <= 1:
return arr
mid = n // 2
left_arr = devide(arr[mid:])
right_arr = devide(arr[:mid])
์ด์ ๋ถํ ๋ ๋ฐฐ์ด์ ๋ณํฉํ ์ฐจ๋ก์ด๋ค.
๋ณํฉํ๋ ๋ถ๋ถ์ ์ดํด๋ณด์.
๋งค๊ฐ๋ณ์๋ก๋ ๋ถํ ๋ ์ผ์ชฝ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ๋ถ๋ถ ๋ฐฐ์ด์ ๋ฐ๋๋ค.
๊ฐ ๋ฐฐ์ด์ ๋
๋ฆฝ์ ์ธ ์ธ๋ฑ์ค(left_idx
, right_idx
)๋ฅผ ๊ฐ๊ณ ์๋ก ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋น๊ตํ๋ฉฐ ๋ ์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ณํฉํ๋ค (์ค๋ฆ์ฐจ์)
def merge(left, right):
merge_list = []
left_idx = 0
right_idx = 0
while left_idx < len(left) and right_idx < len(right):
if left[left_idx] < right[right_idx]:
merge_list.append(left[left_idx])
left_idx += 1
else:
merge_list.append(right[right_idx])
right_idx += 1
if left_idx < len(left):
for i in range(left_idx, len(left)):
merge_list.append(left[i])
else:
for i in range(right_idx, len(right)):
merge_list.append(right[i])
return merge_list
์ ์ฒด์ฝ๋
def devide(arr):
n = len(arr)
if n <= 1:
return arr
mid = n // 2
left_arr = devide(arr[mid:])
right_arr = devide(arr[:mid])
return merge(left_arr, right_arr)
def merge(left, right):
merge_list = []
left_idx = 0
right_idx = 0
while left_idx < len(left) and right_idx < len(right):
if left[left_idx] < right[right_idx]:
merge_list.append(left[left_idx])
left_idx += 1
else:
merge_list.append(right[right_idx])
right_idx += 1
if left_idx < len(left):
for i in range(left_idx, len(left)):
merge_list.append(left[i])
else:
for i in range(right_idx, len(right)):
merge_list.append(right[i])
return merge_list