์ ๋ ฌ(Sorting)์ด๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค.
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ฉด ์ด์ง ํ์(Binary Search)์ด ๊ฐ๋ฅํด์ง๋ค. ๋ํ ํ๋ก๊ทธ๋จ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ๋ ์ด๋ค ์์ผ๋ก๋ ์ ๋ ฌํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ก๊ทธ๋จ ์์ฑ ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค.
์ ํ ์ ๋ ฌ(Selection Sort)
๐ก ์์ด๋์ด
๋ฐ์ดํฐ๊ฐ ๋ฌด์์๋ก ์ฌ๋ฌ ๊ฐ ์์ ๋, ๊ทธ์ค์์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ๋ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ์์์ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด๋ณด์
=> ๋งค๋ฒ ๊ฐ์ฅ ์์ ๊ฒ์ ์ ํํ๋ค
๐ก ์์ค์ฝ๋
def sel_sort(array):
for i in range(len(array)):
min_index = i # ๊ฐ์ฅ ์์ ์์์ ์ธ๋ฑ์ค
for j in range(i + 1, len(array)):
if array[j] < array[min_index]:
min_index = j
array[i], array[min_index] = array[min_index], array[i] # swap
return array
# ์๊ฐ๋ณต์ก๋: O(N^2)
์ฝ์ ์ ๋ ฌ(Insertion Sort)
๐ก ์์ด๋์ด
๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ, ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํด๋ณด์
๐ก ์์ค์ฝ๋
def ins_sort(array):
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j] < array[j - 1]: # ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋
array[j], array[j - 1] = array[j - 1], array[j]
else: # ์๊ธฐ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๊ทธ ์์น์์ ๋ฉ์ถค
break
return array
# ์๊ฐ๋ณต์ก๋: O(N^2)
์ฝ์ ์ ๋ ฌ์ ๊ฒฝ์ฐ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ์ฃผ์์ ๋ O(N)์ ์๋ํ๋ค. ์ด์ด์ ๋์ฌ ํต ์ ๋ ฌ๊ณผ ๋น๊ตํ์ ๋, ๋ณดํต์ ๊ฒฝ์ฐ ์ฝ์ ์ ๋ ฌ์ด ๋ ๋นํจ์จ์ ์ด์ง๋ง ์ ๋ ฌ์ด ๊ฑฐ์ ๋์ด ์๋ ์ํฉ์์๋ ๋ ๊ฐ๋ ฅํ๋ค๋ ๊ฒ์ ๊ผญ ๊ธฐ์ตํ๊ณ ์ ํ์ฉํ์!!!๐
ํต ์ ๋ ฌ(Quick Sort)
๐ก ์์ด๋์ด
๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊ฟ๋ณด์!
๐ก ๋ถํ ๊ณผ์
ํต ์ ๋ ฌ์ ๊ธฐ์ค(pivot)์ ์ค์ ํ ๋ค์ ํฐ ์์ ์์ ์๋ฅผ ๊ตํํ ํ, ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
ํผ๋ฒ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ์์ด ์์ง๋ง, ์ฌ๊ธฐ์๋ ๋ํ์ ์ธ ๋ถํ ๋ฐฉ์์ธ ํธ์ด ๋ถํ (Hoare Partition) ๋ฐฉ์์ผ๋ก ํผ๋ฒ์ ์ ํ๊ฒ ๋ค. ํธ์ด ๋ถํ ๋ฐฉ์์์๋ '๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ'๋ฅผ ํผ๋ฒ์ผ๋ก ์ ํ๋ค.
ํผ๋ฒ์ ์ค์ ํ ๋ค์๋ ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ค์ ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๋ฐ๊พผ๋ค. ์ด ๊ณผ์ ์ ์ผ์ชฝ์์ ์ถ๋ฐํ ํฌ์ธํฐ์ ์ค๋ฅธ์ชฝ์์ ์ถ๋ฐํ ํฌ์ธํฐ๊ฐ ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๋ ํฌ์ธํฐ๊ฐ ์๊ฐ๋ฆฐ ์์ ์์, ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ์์น๋ฅผ ์๋ก ๋ฐ๊พผ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ํผ๋ฒ์ ์ผ์ชฝ์๋ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ง, ํผ๋ฒ์ ์ค๋ฅธ์ชฝ์๋ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ง ์กด์ฌํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ์ ๋ถํ (Divide) ๋๋ ํํฐ์ (Partition)์ด๋ผ๊ณ ํ๋ค.
ํผ๋ฒ์ ๋ฐ๋ผ ๋ถํ ๋ ์ํ์์ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ ฌ์ํค๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค ๋ณด๋ฉด ์ ์ฒด ๋ฆฌ์คํธ์ ๋ํ์ฌ ์ ๋ ฌ์ด ์ด๋ค์ง๊ฒ ๋๋ค.
๐ก ์์ค์ฝ๋
def quickSort(array):
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:]
leftSide = [x for x in tail if x <= pivot]
rightSide = [x for x in tail if x > pivot]
return quickSort(leftSide) + [pivot] + quickSort(rightSide)
# ํ๊ท ์๊ฐ๋ณต์ก๋: O(NlogN)
# ์ต์
์ ๊ฒฝ์ฐ: O(N^2)
ํต ์ ๋ ฌ์์ ์ต์ ์ ๊ฒฝ์ฐ๋ ํผ๋ฒ๊ฐ์ด ์ ํํ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ฉ ๋๋๋ ๊ฒ์ ๋ฐ๋ณตํ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด ๋๋ค.
ํต ์ ๋ ฌ์์ ์ต์ ์ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฃผ์์ ๋์ด๋ค. ์ด ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ด ๋๋ค.
๊ณ์ ์ ๋ ฌ(Count Sort)
๐ก ๊ณ์ ์ ๋ ฌ์ด๋?
๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ด K์ผ ๋ ์ํ ์๊ฐ O(N + K)๋ฅผ ๋ณด์ฅํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํ์ง๋ง ์ธ์ ๋ ์ฐ๊ธฐ ์ ํฉํ ๊ฒ์ ์๋๊ณ , ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋๋ง ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ max๊ฐ๊ณผ min๊ฐ์ ์ฐจ์ด๊ฐ 1,000,000์ ๋์ง ์์ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ๊ณ์ ์ ๋ ฌ์ ์ํํ๋ ค๋ฉด ๋ชจ๋ ๋ฒ์๋ฅผ ๋ด์ ์ ์๋ ํฌ๊ธฐ์ ๋ฆฌ์คํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ณ์ ์ ๋ ฌ์ ์ํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฐ์ดํฐ์ (min, max) ๋ฒ์๋ฅผ ํฌํจํ๋ ํ๋์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํจ
- ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํด
- ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ๊ทธ ๊ฐ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅ
๐ก ์์ค์ฝ๋
def countSort(array):
count = [0] * (max(array) + 1)
for x in array:
count[x] += 1
result = []
for i in range(len(count)):
for j in range(count[i]):
result.append(i)
return result
# ์๊ฐ๋ณต์ก๋: O(N + K)
์ฐธ๊ณ ์๋ฃ: ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with Python(๋๋๋น ์ , ํ๋น๋ฏธ๋์ด)
'Algorithm > ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(Binary Search) (0) | 2021.07.12 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(Dijkstra) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ (0) | 2021.03.30 |
[์๊ณ ๋ฆฌ์ฆ] BFS(๋๋น ์ฐ์ ํ์) ๊ฐ๋ ๋ฐ ๊ตฌํ(ํ์ด์ฌ) (0) | 2021.03.23 |
[์๊ณ ๋ฆฌ์ฆ] DFS(๊น์ด ์ฐ์ ํ์) ์๊ณ ๋ฆฌ์ฆ ๋ฐ ๊ตฌํ(ํ์ด์ฌ) (0) | 2021.03.23 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ(ํ์๋ฒ) (0) | 2021.03.08 |