ํฐ์คํ ๋ฆฌ ๋ทฐ
์๊ณ ๋ฆฌ์ฆ: ์ ๋ ฌ
dirmathfl 2020. 6. 17. 18:45์ ๋ ฌ ๋ฐฉ์
์์ฃผ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค. ์ฒซ ๋ฒ์งธ๋ก 2์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ Bubble, Select, Insert ์ ๋ ฌ์ด๋ค. ๋ ๋ฒ์งธ๋ ๋ถํ -์ ๋ณต ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๋ณํฉ, ํต ์ ๋ ฌ์ด๋ค.
2์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์
ํด๋น ๋ฐฉ์์ ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(N^2)์ด ๋๋ค.
์ด์ ๊ฐ์ ์ด์ ๋ 2๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ํตํด ๊ฐ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ด๋ค.
Bubble Sort
์๋ก ์ธ์ ํ ๋ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. swap์ด ๋ ์ด์ ๋ฐ์ํ์ง ์์ผ๋ฉด, ์ค๋จํ์ฌ ๋ถํ์ํ ๋ฐ๋ณต๋ฌธ์ ์คํํ์ง ์์ ์ ์๋ค.
def bubble_sort(nums):
for i in range(len(nums)):
swap = False
for j in range(1, len(nums)):
if nums[j - 1] > nums[j]:
nums[j - 1], nums[j] = nums[j], nums[j - 1]
swap = True
if not swap:
break
Select Sort
์ ๋ ฌ ํ๊ณ ์ ํ๋ ๊ฐ๋ค ์ด์ธ์ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์๋ in-place ์ ๋ ฌํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋ง๊ทธ๋๋ก ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ์ ํํ๊ณ , ๊ฐ์ฅ ์์ ๊ฐ์ ํ์ํ์ฌ ๋งจ ์์ ์์น๋ก ๊ฐ ์ ์๋๋ก ํ๋ ๋ฐฉ์์ด๋ค.
def select_sort(num):
for i in range(len(num)):
min_idx = i
for j in range(i + 1, len(num)):
if num[min_idx] > num[j]:
min_idx = j
num[i], num[min_idx] = num[min_idx], num[i]
Insert Sort
์์์ ๊ฐ์ ๋น๊ตํ์ฌ ํด๋น ์์๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค. Bubble, Select์ ๋ฌ๋ฆฌ ๋ผ์ด๋๊ฐ ์งํํ ์๋ก ๋น๊ต ๋์์ด ์ฆ๊ฐํ๋ค.
def insert_sort(num):
for i in range(len(num)):
key = num[i]
j = i - 1
while j >= 0 and key < num[j]:
num[j+1] = num[j]
j -= 1
num[j+1] = key
๋ถํ -์ ๋ณต์ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์
2์ค ๋ฐ๋ณต๋ฌธ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ ๋ ฌํ ์ ์๋ ๋ฐฉ์์ด๋ฉฐ, ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ๋จ๊ณ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ์ฌ ๋ถํ -์ ๋ณต์ด๋ผ๊ณ ํํํ๋ค.
Merge Sort
๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋์ด left, right๋ฅผ ๊ฐ๊ฐ ์ฌ๊ท ํธ์ถ์ ํตํด ์ฒ๋ฆฌํ๊ฒ ๋๋ฉฐ, ๋ ์ด์ ๋๋์ด์ง์ง ์๊ฒ ๋๋ฉด ๊ฐ์ด ๋ฐํ๋์ด ์ ๋ ฌ๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
def merge_sort(num):
length = len(num)
if length <= 1:
return
mid = length // 2
left = num[:mid]
right = num[mid:]
merge_sort(left)
merge_sort(right)
# left index
i = 0
# right index
j = 0
# num list index
k = 0
# left, right์ ๊ฐ์ ๋น๊ตํ์ฌ ์๋ ๋ฐฐ์ด์ ๊ฐ์ ์ ๋ ฌํจ
while i < len(left) and j < len(right):
if left[i] < right[j]:
num[k] = left[i]
i += 1
else :
num[k] = right[j]
j += 1
k += 1
# ๋์๋น๊ต๊ฐ ๋์ง ์์ ๋๋จธ์ง ๊ฐ๋ค์ ๋ฃ์
while i < len(left):
num[k] = left[i]
i += 1
k += 1
while j < len(right):
num[k] = right[j]
j += 1
k += 1
Quick Sort
๊ธฐ์ค ๊ฐ์ ์ ํ์ฌ ์์์ ๊ธฐ์ค ๊ฐ์ ๋น๊ต ํ ๊ฐ์ด ์์ผ๋ฉด less๋ก ํฌ๋ฉด more๋ก ๋ถ๋ฅํ์ฌ ์ ๋ ฌ์ ํ๋ ๋ฐฉ์์ด๋ค.
def quick_sort(num):
length = len(num)
if length <= 1:
return num
pivot = num[0]
less = []
more = []
for i in range(1, len(num)):
if num[i] < pivot:
less.append(num[i])
else:
more.append(num[i])
return quick_sort(less) + [pivot] + quick_sort(more)
'๐๏ธโโ๏ธ ๊ธฐ๋ฐ ๋ค์ง๊ธฐ > ์๋ฃ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฃ๊ตฌ์กฐ : Binary Search Tree (0) | 2021.01.17 |
---|---|
์๋ฃ๊ตฌ์กฐ: Hash (6) | 2021.01.10 |
์๊ณ ๋ฆฌ์ฆ: DFS์ BFS (0) | 2020.06.16 |
์๊ณ ๋ฆฌ์ฆ: Recursion (0) | 2020.06.16 |
์๋ฃ๊ตฌ์กฐ: Linked List (0) | 2020.06.15 |