
๐ก ์ ํ ์ ๋ ฌ (Selection Sort)
- ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ ์ค์์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ๋ฐ์ดํฐ์ ๋ฐ๊พผ๋ค.
- ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ ์ค ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ๋งจ ์ ๋ฐ์ดํฐ์ ๋ฐ๊ฟ
- ์ด๋ฌํ ๊ณผ์ ๋ฐ๋ณต (๋ง์ง๋ง ๊ฒฝ์ฐ์๋ ์ฒ๋ฆฌํ์ง ์์๋ ๋๋ค)
- ํ์ ๋ฒ์๋ ์ ์ ์ค์ด๋ ๋ค.
- ๋งค๋ฒ ์ ํ ํ์ํ๋ค.
- ๋ณต์ก๋ O(N^2) : n๋ฒ ๋งํผ ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ์์ ๋งจ ์์ผ๋ก ๋ณด๋ธ๋ค.
- n + (n-1) + (n-2) = (n^2 +n - 2) / 2
๐งท ๊ตฌํ ๊ณผ์
array = [๋ฆฌ์คํธ]
for : ๋ฆฌ์คํธ ๊ธธ์ด๋งํผ
for : i๋ถํฐ 0๊น์ง 1์ฉ ์ค๋ฉด์
if : ํ์ฌ ์์๊ฐ ์์ ์์๋ณด๋ค ์๋ค๋ฉด : ์๋ก ๋ฐ๊ฟ
else : break
print(๋ฆฌ์คํธ)
๐งท ํ์ด์ฌ ์ฝ๋
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
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
print(array)
๐ก ์ฝ์ ์ ๋ ฌ
- ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๊ณจ๋ผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ค.
- ์ ํ ์ ๋ ฌ์ ๋นํด ๋์ด๋ ์กฐ๊ธ ๋์ง๋ง ๋น ๋ฅด๋ค.
| 7 | 5 | 9 | 0 | 3 | 1 | 6 | 2 | 4 | 8 |
- ์์ ์์๊ฐ ์ ๋ ฌ๋์ด ์๋ค๊ณ ๊ฐ์
- 7์ ๊ทธ์์ฒด๋ก ์ ๋ ฌ, 5๊ฐ ์ด๋ค ์์น๋ก ๋ค์ด๊ฐ์ง ์ผ์ชฝ์ด๊ฑฐ๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ค์ด๊ฐ๊ฑฐ๋ ์์ผ๋ฉด ์ผ์ชฝ์ผ๋ก (์ค๋ฆ์ฐจ์์ผ๋ก ๊ฐ์ )
- 9๊ฐ 3๊ณณ(5์, 5์ 7์ฌ์ด, 7๋ค) ์ค ์ด๋์ ๋ค์ด๊ฐ ์ง, 7๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก
- 0์ด ์ด๋๋ก ๋ค์ด๊ฐ์ง, 5์ ์ผ์ชฝ๊น์ง ํ๋์ฉ ์ด๋, ๋งค๋ฒ ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ฉด์
- ์ด ๊ณผ์ ๋ฐ๋ณต
- ๋ณต์ก๋ O(N^2) : ๋ฐ๋ณต๋ฌธ ์ค์ฒฉ -> ๋น๊ต, ์ค์ํ
- ํ์ฌ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ ์ํ๋ฉด ๋งค์ฐ ๋น ๋ฆ - ๋ค ์ ๋ ฌ๋๋ฉด O(N)
๐งท ๊ตฌํ ๊ณผ์
array = ๋ฆฌ์คํธ
for ๋ฆฌ์คํธ ๊ธธ์ด๋งํผ : ๊ฐ์ฅ ์์ ๊ฐ
for i, 0, -1 : 1์ฉ ๊ฐ์ํ๋ฉด์
if min_index์ ๊ฐ๋ณด๋ค ์ธ๋ฑ์ค j์ ๊ฐ์ด ์๋ค๋ฉด : min_index๋ฅผ j๋ก ์ ๋ฐ์ดํธ
i์ ๊ฐ์ฅ ์์ ์ธ๋ฑ์ค ์ค์ํ
๐งท ํ์ด์ฌ ์ฝ๋
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
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]
print(array)
๐ก ํต ์ ๋ ฌ
- ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ , ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ ์์น๋ฅผ ๋ฐ๊ฟ
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ
- ๋ณํฉ๊ณผ ๋์ธ์ด ํ์ค ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทผ๊ฐ
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ํต ์ ๋ ฌ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค ๋ฐ์ดํฐ(pivot)์ผ๋ก ์ค์
๐งท ๊ตฌํ ๊ณผ์
- ํ์ฌ ํผ๋ฒ์ ๊ฐ์ 5, ์ผ์ชฝ์์๋ถํฐ ํฐ๊ฐ, ์ค๋ฅธ์ชฝ์์ ๋ถํฐ ์์๊ฐ 4์ 7์ ์์น ๋ฐ๊ฟ
- ์์น๊ฐ ์๊ฐ๋ฆฐ๊ฒฝ์ฐ ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ๊ฐ์ ์์น๋ฅผ ๋ฐ๊ฟ์ค
- ํผ๋ฒ์ด ์ค๊ฐ์ผ๋ก ๋ค์ด๊ฐ๊ฒ๋๋ค.-> ์ผ์ชฝ์ ๋ฐ์ดํฐ๋ ํผ๋ฒ๋ณด๋ค ์๊ณ , ์ค๋ฅธ์ชฝ์ ํฐ ๋ฐ์ดํฐ
- ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ ๊ฐ ๊ฐ์ ๋ฐฐ์ด๋ก ์ทจ๊ธํ์ฌ ๊ฐ๊ฐ ํต ์ ๋ ฌ ์ํ -> ์ฌ๊ท์ ์ผ๋ก, ๋ฒ์ ์ ์ ์์์ง
- ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ ๊ฐ๊น๊ฒ ๋ถํ ๋๋ค๋ฉด O(nlogn) : ๋๋น x ๋์ด
- ํ๊ท ์ ๊ฒฝ์ฐ O(NlogN)
- ์ต์ (N^2)
- ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ : ๋ถํ ์ด ์ด๋ฃจ์ด์ก์ ๋ ๋ถํ ์ด ์ด๋ฃจ์ด์ง์ง ์๋๋ค. ๋ถํ ์ ์ํด ๋งค๋ฒ ์ ํ ํ์์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐งท ๊ตฌํ ๊ณผ์
array = ๋ฆฌ์คํธ
def ํต (array, start, end) # ๋ฆฌ์คํธ, ์ฒซ
if (start >= end) ์์ ํ๊ฐ์ผ๋ ์ข ๋ฃ : return
pivot = ์ฒซ ๋ฒ์งธ ์์
left = ์ฒซ๋ฒ์งธ + 1 (๊ฐ์ฅ ์ผ์ชฝ)
right = end (๊ฐ์ฅ ์ค๋ฅธ์ชฝ)
while left <= right
while ์ผ์ชฝ์์ ๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ์ฐพ์ ๋๊น์ง: left 1์ฉ ์ฆ๊ฐ
while ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ ์ฐพ์ ๋๊น์ง : right 1์ฉ ๊ฐ์
if (left > right) ์๊ฐ๋ ธ๋ค๋ฉด, ์์ ๋ฐ์ดํฐ <-> ํผ๋ฒ --- ๋ถํ
else ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด, ์์ ๋ฐ์ดํฐ <-> ํฐ ๋ฐ์ดํฐ
quick_sort(๋ฆฌ์คํธ, ์์, ์ค๋ฅธ์ชฝ-1)
quick_sort(๋ฆฌ์คํธ, ์ค๋ฅธ์ชฝ+1, ๋)
ํต (array, 0, ๋ฆฌ์คํธ๊ธธ์ด-1)
๐งท ํ์ด์ฌ ์ฝ๋
array = [5,7,9,0,3,1,6,2,4,8]
def quick_sort(array, start, end):
if start >= end:
return
pivot = start
left = start + 1
right = end
while (left <= right):
while (left <= end) and (array[left] <= array[pivot]): # array[left]<=array[pivot]
left += 1
while (right > start) and (array[right] >= array[pivot]):
right -= 1
if left > right :
array[pivot], array[right] = array[right], array[pivot] #right : ์์ ๋ฐ์ดํฐ
else:
array[left], array[right] = array[right], array[left]
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print("quick_sort :", array)
๐งท ํ์ด์ฌ ์ฑ์ง ์ด์ฉํ ์ฝ๋
def ํต(๋ฆฌ์คํธ):
if ๊ธธ์ด <= 1: return
pivot = ์ธ๋ฑ์ค 0
tail = [1:] ํผ๋ฒ ์ ์ธ ๋ฆฌ์คํธ
์ผ์ชฝ๋ฆฌ์คํธ = tail ๋๋ฉด์ pivot๋ณด๋ค ์์ ๊ฑฐ
์ค๋ฅธ์ชฝ๋ฆฌ์คํธ = tail ๋๋ฉด์ pivot๋ณด๋ค ํฐ ๊ฑฐ
return ์ผ์ชฝ๋ฆฌ์คํธ+ํผ๋ฒ+์ค๋ฅธ์ชฝ๋ฆฌ์คํธ
def quick_sort2(array):
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:]
left_array = [x for x in tail if x <= pivot]
right_array = [x for x in tail if x > pivot]
return quick_sort2(left_array) + [pivot] + quick_sort2(right_array)
print("quick_sort2 :", quick_sort2(array))
๐ก๊ณ์ ์ ๋ ฌ
- ํน์ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง
- ๋ฐ์ดํฐ์ ํฌ๊ธฐ ์ ํ, ์ ์ ํํ๋ก ํํํ ์ ์์ ๋
- O(N+K)
- ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ถํฐ ํฐ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ด๊ธฐ๋๋ก ๋ฆฌ์คํธ ์์ฑ, ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋์ง
- ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ
- ๊ฐ ๋ฐ์ดํฐ๊ฐ ๋ช ๋ฒ ๋ฑ์ฅํ๋ ์ง ๊ทธ ํ์ ๊ธฐ๋ก
- ๊ฒฐ๊ณผ ํ์ธ ํ ๋, ๊ฐ์๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅ
- ์๋์ ์ผ๋ก ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ๋์ง๋ง ์กฐ๊ฑด์ ๋ง๋๋ค๋ฉด ๋น ๋ฅด๋ค
๐งท ๊ตฌํ ๊ณผ์
array = ๋ฆฌ์คํธ
count๋ฆฌ์คํธ = [0] * (์ต๋๊ฐ+1)
for ๋ฆฌ์คํธ ๊ธธ์ด ๋งํผ : count์ ํด๋น ์ธ๋ฑ์ค์ 1 ์ฆ๊ฐ
for count๊ธธ์ด ๋งํผ
for count ๋ฆฌ์คํธ ์ธ๋ฑ์ค๋ฅผ ๋๋ฉด์ : ๊ทธ ์์ ๋ค์ด์๋ ๊ฐ๋งํผ ํ๋ฆฐํธ
๐งท ํ์ด์ฌ ์ฝ๋
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
count = [0] * (max(array)+1)
for i in array:
count[i] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=" ")
- ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋ ๋ชจ๋ N(O+K)
๋ฐ์ดํฐ๊ฐ 0๊ณผ 999999๋ผ๋ฉด ๋นํจ์จ์ - ๋์ผํ ๋ฐ์ดํฐ ๊ฐ์ด ์ฌ๋ฌ๊ฐ ๋ฑ์ฅํ ๋ (์ฑ์ ์ ๊ฒฝ์ฐ 100์ ์ด ์ฌ๋ฌ๋ช )
'Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] BFS ์๊ณ ๋ฆฌ์ฆ (0) | 2023.12.20 |
|---|---|
| [Python] ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ (1) | 2023.11.20 |
| [Python] ์ฑ์ ํ๊ท - ์ฝ๋ฉํ ์คํธ ๋ฌธ์ (4) | 2023.11.20 |
| [Python] DFS ์๊ณ ๋ฆฌ์ฆ (0) | 2023.11.13 |
| [Python] 1์ด ๋ ๋๊น์ง (๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ) (0) | 2023.11.13 |