- ์ด๋ค ์ ๋ ฌ์ ์ฐ๋์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ํจ์จ์ฑ์ด ์ข์ง์ฐ์ง๋ ์ ์๋ค.
- ์ ๋ ฌ์ ๋ฉด์ ๋จ๊ณจ ์ง๋ฌธ์ด๊ธฐ๋ ํ๋ค.
- ๋ฒ๋ธ ์ ๋ ฌ, ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ, ๊ณ์ ์ ๋ ฌ, ๋ณํฉ ์ ๋ ฌ, ํ ์ ๋ ฌ ์ ๋๊น์ง๋ ์๊ณ ์์ผ๋ฉด ์ข๋ค.
์ผ์ชฝ๋ถํฐ ์๊ธฐ ์ค๋ฅธ์ชฝ ์์์ ๋น๊ตํด ๋ณธ์ธ์ด ๋ ํฌ๋ฉด swap ํ ๋ฒ์ ์ํ๋ง๋ค ํฐ(์ค๋ฅธ์ชฝ) ์๋ฆฌ์ ์์๊ฐ ์ ํด์ง๋ค.
def bubble_sort(array):
for i in range(0, len(array)):
for j in range(1, len(array)-i):
if array[j-1] > array[j]:
array[j-1], array[j] = array[j], array[j-1]์๋ค๊ณ ๋ฉ์ถ๊ณ ์ด๋ฐ ๊ฒ ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ ๊ฒฝ์ฐ, ์ต์
์ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ผํ๊ฒ O(N^2)
์ํํ๋ฉฐ ์ ์ผ ์์ ๋ฐ์ดํฐ๋ฅผ ๋งจ ์์ผ๋ก ์ฎ๊น์ผ๋ก์จ ์ผ์ชฝ๋ถํฐ ์ ๋ ฌ์ ์์ฑํด๊ฐ๋ ๋ฐฉ์ ํ ๋ฒ์ ์ํ๋ง๋ค ์์(์ผ์ชฝ) ์๋ฆฌ์ ์์๊ฐ ์ ํด์ง๋ค.
def selection_sort(array):
for i in range(len(array)):
min_index = i
for j in range(i + 1, len(array)):
if array[min_index] > array[j]:
min_index = j
array[i], array[min_index] = array[min_index], array[i]
array = [7, 3, 1, 5, 9]
selection_sort(array)
print(array) # [1, 3, 5, 7, 9]๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก O(N^2)์ด๋ค.
- (N-1) + (N-2) + ... + 2 = N(N+1)/2 ๋ผ์
- ๋ฐ๋ณต๋ฌธ์ด ๋ ๋ฒ ์ค์ฒฉ๋์์ผ๋ฏ๋ก
๋ฐ๋ผ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด์ ์ฌ์ฉํ๊ธฐ์๋ ์กฐ๊ธ ๋๋ฆฌ๋ค.
2๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ์์ํ์ฌ, ์๊ธฐ ์ผ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ ํฌ๋ค๋ฉด swap, ์์ ๋ณด๋ค ์๋ค๋ฉด ๋ฉ์ถค์ผ๋ก์จ ์ผ์ชฝ๋ถํฐ ์ ๋ ฌ์ ์์ฑํด๊ฐ๋ ๋ฐฉ์ ํ ๋ฒ์ ์ํ๋ง๋ค ์ผ์ชฝ์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ์๊ฐ 1๊ฐ์ฉ ๋์ด๋๋ค.
์ฝ์
์ ๋ ฌ์ ์์ง์ผ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด ์ผ์ชฝ ์ ๋ค์ ์์๋ ๋ชจ๋ ์ ๋ ฌ๋ ์ํ๋ผ๋ ์ ์ (์ค์ ๋ก ๊ทธ๋ฌํ๋ค)๋ก ๋์ํ๋ค.
def insertion_sort(array):
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j] >= array[j - 1]:
break
array[j], array[j - 1] = array[j - 1], array[j]
array = [7, 3, 1, 5, 9]
insertion_sort(array)
print(array) # [1, 3, 5, 7, 9]์ ํ ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก O(N^2)์ด๋ค.
๊ทธ๋ฌ๋ ์ต์ ์ ์๊ฐ๋ณต์ก๋๋ O(N)์ด๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ ๋ ฌ๋ ์ํ์ ์๋ฃ์์ ํจ์จ์ ์ด๋ค.
๊ธฐ์ค ๋ฐ์ดํฐ(ํผ๋ฒ)๋ฅผ ์ค์ ํ๊ณ ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ ์ผ๋ก ์ผ์ชฝ์๋ ๋ณด๋ค ์์ ๋ฐ์ดํฐ๊ฐ, ์ค๋ฅธ์ชฝ์๋ ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๊ฐ ์ค๊ฒ ํ๋ ๋ฐฉ์
- ์ฒซ ๋ฒ์งธ ์์๋ฅผ ํผ๋ฒ์ผ๋ก ์ก๊ณ ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ, ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
- ์ฐพ์ ํ ๋ ๋ฐ์ดํฐ๊ฐ ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด swap, ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
- 2๋ฒ๊น์ง ์ํํ๊ณ ๋๋ฉด ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ๋ณด๋ค ์์ ๋ฐ์ดํฐ๊ฐ, ์ค๋ฅธ์ชฝ์ ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๊ฒ ๋๋ค.
def quick_sort(array, start, end):
if start >= end:
return
pivot = start
left, right = start + 1, end
while True:
while left <= end:
if array[pivot] < array[left]:
break
left += 1
while right > start:
if array[pivot] >= array[right]:
break
right -= 1
if left >= right:
break
array[left], array[right] = array[right], array[left]
array[pivot], array[right] = array[right], array[pivot]
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
array = [6, 4, 1, 3, 5, 0]
quick_sort(array, 0, len(array) - 1)
print(array)์ด์จ๋ ํผ๋ฒ์ ์ ํ๊ณ ํผ๋ฒ๋ณด๋ค ์ผ์ชฝ์๋ ์์ ๋ฐ์ดํฐ, ์ค๋ฅธ์ชฝ์๋ ํฐ ๋ฐ์ดํฐ๊ฐ ์ค๊ฒ ๋ง๋ ๋ค ์ฌ๊ท๋ก ๊ฐ ๋ฐฐ์ด์ ๋ํด ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ค๋ฉด ํต์ํธ๋ ๋์๊ฐ๋ค.
์๋๋ ์ด๋ฌํ ์ ์์ ์ฐฉ์ํ ํ์ด์ฌ์ ํนํ๋ ์ฝ๋์ด๋ค.
์์ ๋ฌ๋ฆฌ ๋ฐฐ์ด ์์ฒด๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์๋๋ผ ์ ๋ ฌํ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
def quick_sort(array):
if len(array) <= 1: # ๋ ๊ฐ๋ถํฐ ์ฌ๊ท์ ๋ค์ด๊ฐ๋ฏ๋ก
return array
pivot = array[0]
tail = array[1:] # ์ด ๋ฌธ์ฅ์ด ๋ฐ๋์ ์ ํจํด์ง๋ ๊ฒ (1๊ฐ ์ดํ๋ฉด ์๋ฌ ๋ฐ์)
left = [i for i in tail if i < pivot]
right = [i for i in tail if i >= pivot]
return quick_sort(left) + [pivot] + quick_sort(right)์ต์ ์ ๊ฒฝ์ฐ
- ํญ์ ํผ๋ฒ์ด ์ ์ค์์ ์์นํ๊ฒ ๋ ๋
- ์ฆ, ํญ์ ์ ์ค์์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ์ชผ๊ฐ ์ฌ๊ท์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ
- ์ด ๋ ์๊ฐ ๋ณต์ก๋๋
O(NlogN)์ด๋ค.
์ต์
์ ๊ฒฝ์ฐ
- ๋ฐฐ์ด์ด ํ ์ชฝ์ผ๋ก ์น์ฐ์ณ ์ชผ๊ฐ์ ธ ๋ฐ์ดํฐ์ ๊ฐ์๋งํผ ์ชผ๊ฐ์ง๋ ๊ฒฝ์ฐ
- ์ด ๋ ์๊ฐ ๋ณต์ก๋๋
O(N^2)์ด๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ด ํผ๋ฒ์ ์ ์ ํ๋ ๊ฒฝ์ฐ ํต ์ ๋ ฌ์ ์คํ๋ ค ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์ ๋๋ฆฌ๊ณ , ๋ฌด์์ ๋ฐ์ดํฐ์์ ๋นจ๋ผ์ง๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ณ๋์ ํผ๋ฒ ์ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๊ธฐ๋ ํ๋ค.
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํด ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ๋ฐฉ์
์ง๊ธ๊น์ง ๋ณธ ์ ํ, ์ฝ์
, ํต ์ ๋ ฌ์ ๋น๊ต ๊ธฐ๋ฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ๋ฅผ ์นด์ดํธํ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๋น๊ต ๊ธฐ๋ฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์๋๋ค.
def counting_sort(array):
new_array = []
count = [0] * (max(array) + 1)
for i in array:
count[i] += 1
for i in range(len(count)):
for j in range(count[i]):
new_array.append(i)
return new_array๋ฐ์ดํฐ์ ๊ฐ์ N๊ณผ ์ต๋๊ฐ์ ํฌ๊ธฐ K์ ๋ํ์ฌ,
๋ฐฐ์ด ๋๋ฉด์ ๊ฐ ์์๋ณ๋ก count ์ฆ๊ฐ O(N)
0๋ถํฐ ์ต๋๊ฐ K๊น์ง ๋๋ฉด์ ์์๋๋ก ์ ๋ฐฐ์ด์ ์ฝ์ O(K)
๋ ๊ฐ๋ฅผ ๊ฐ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์ํํ๋ฏ๋ก O(N + K)
0๊ณผ 999,999 ๋จ ๋ ๊ฐ์ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ ฌ์ ์ํํ๋ค๋ฉด ๋งค์ฐ ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์๊ณ ์ค๋ณต๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ฐ๋ผ์, ๋ณดํต ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์๊ณ ์ด๋ค์ ๊ฐ์๋ฅผ ์ธ์ผ ํ๋ ๊ฒฝ์ฐ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์ ๋ ฌ์ ํตํด ์ฐ์ ์์๋ฅผ ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ์ ํด๋นํ๋ค.
์๊ฐ ๋ณต์ก๋๋ฅผ ์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋ด๊ฐ ๋ฐ๋ณต๋ฌธ ์ค์ฒฉ์ ํด๋ ๋ ์ง ์๋์ง ๋ฑ์ ์ ์๊ฐํ ๊ฒ
- ์ ๋ ฌ ์กฐ๊ฑด ๊ฐ์ ์ฐ์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ์ญ์์ผ๋ก ์ ์ฉํ๋ค. (์ฆ, ์ฐ์ ๋๊ฐ ๋ฎ์ ์ ๋ ฌ ์กฐ๊ฑด์ ๋จผ์ ์ ์ฉ)
- ์ด์ : ๋จผ์ ์ ์ฉํ๋ ์กฐ๊ฑด์์ ๊ฐ์ ์ฐ์ ๋๋ฅผ ๊ฐ๋ ์ ๋ค์ ๋ค์ ์กฐ๊ฑด์ ์ ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก ๋จผ์ ์ ์ฉํ ์กฐ๊ฑด์ ๋์ค์ ์ ์ฉํ๋ฉด ์์์ ์ ๋ ฌ๋ (๊ฐ์ ์ฐ์ ๋๋ฅผ ๊ฐ์ง) ์ ๋ค์ ์์์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.