2020. 8. 26. 18:01ใ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค/์ ๋ ฌ
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ฌ
์ ๋ ฌ
- ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ.
๋ฌธ์ ๋ฅผ ํ๊ฑฐ๋, ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌํํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ "์ํ์๊ฐ"์ด๋ค. ์ด ์ํ์๊ฐ์ ์ํฉ์ ๋ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ค์ด๋ ๋ค. ์ด์ ์์ด "์ ๋ ฌ"์ ์์ฃผ ์ค์ํ ์์๊ฐ ๋๋ค.
์ด ๊ธ์์๋ ๋ํ์ ์ธ ์ ๋ ฌ 3๊ฐ์ง. ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ๋ง์ ์์๋ณผ ๊ฒ์ด๋ค.
์ ํ ์ ๋ ฌ
-๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ ๋ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐ๋ก ์์๋ก ๋์ด๊ฐ๋ณด์.
a = [3, 7, 0, 6] ๋ผ๋ ๋ฆฌ์คํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
1. 0์ ์ ํํด์ 3๊ณผ ๋ฐ๊พผ๋ค -> [0, 7, 3 ,6]
2. 3์ ์ ํํด์ 7๊ณผ ๋ฐ๊พผ๋ค -> [0, 3, 7, 6]
3. 7์ ์ ํํด์ 6๊ณผ ๋ฐ๊พผ๋ค -> [0, 3, 6, 7]
์ด์๊ฐ์ด n๊ฐ์ ์๊ฐ ์์ ๋ n + n-1 + n-2---- +2๊ฐ ๋๊ณ , ์ด๋ ์๊ฐ ๋ณต์ก๋ O(N^2)๋ก ๋ณผ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ 100๊ฐ๋ผ๋ฉด ์ํ ์๊ฐ์ 10,000๋ฐฐ ๋์ด๋๋ ๊ฒ์ด๋ค. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ๊ตฌํํ๊ธฐ๋ ์ฝ์ง๋ง, ์๋นํ ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ ํ ์ ๋ ฌ ์์ค์ฝ๋
array = [0,5,2,7,4]
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)
์ฝ์ ์ ๋ ฌ
-ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ '์ฝ์ 'ํ๋ ์๊ณ ๋ฆฌ์ฆ
-์ ํ ์ ๋ ฌ์ ๋นํด ๊ตฌํ์ ์ด๋ ต์ง๋ง, ์คํ ์๊ฐ ์ธก๋ฉด์์ ๋์ฑ ํจ์จ์ ์ด๋ค
-์ ๋ ฌ์ด ๋์ด์์ ๋ ์๊ฐ ๋ณต์ก๋๊ฐ O(N)์ด๋ค.
-์ฝ์ ์ ๋ ฌ์์ ์ฒซ๋ฒ์งธ๋ ์ ๋ ฌ๋์ด ์๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ๋ถํฐ ์์.
์์
a = [7 5 9 3]
1. 5๋ 7๋ณด๋ค ์๊ธฐ์ ๋์ swapํ๋ค.-->[5 7 9 3]
2. 9๋ 7๋ณด๋ค ํฌ๊ฒ์ ๊ฐ๋งํ ๋๋ค.
3. 3์ 9๋ถํฐ ์๊ธฐ์ swap ํ๋ค--> [5 7 3 9] --> ์ด๋ฅผ ํ ๋ฒ ๋ ์ํํ๋ค -->[5 3 7 9] --> ํ ๋ฒ ๋ ์ํ -->[3 5 7 9]
j๋ฅผ ํ์ํ๋ ์๋ผ๊ณ ๋์์ ๋, j-1๋ณด๋ค ์๋ค๋ฉด swap์ ์งํํ๊ณ ํฌ๋ค๋ฉด break๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ฝ์ ์ ๋ ฌ ์์ค์ฝ๋
array = [1,4,2,5,3,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)
ํต ์ ๋ ฌ
-๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ์๊ณ ๋ฆฌ์ฆ
์ด ๊ธ์์๋ ๋ํ์ ์ธ ๋ถํ ๋ฐฉ์์ผ๋ก ํต ์ ๋ ฌ์ ์๊ฐํ ๊ฒ์ด๋ค. ๋ฐฉ๋ฒ์ ์ฒ์ฒํ ์ดํด๋ณด์
1. ํผ๋ฒ(๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ ์ซ์)๋ฅผ ์ค์ ํ๋ค.
2. ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค. ์ด๋ฅผ swapํด์ค๋ค.
3. ์ผ์ชฝ์์ ์ฐพ๋ ๊ฐ์ด ์ค๋ฅธ์ชฝ์์ ์ฐพ๋๊ฐ๊ณผ ์๊ฐ๋ ธ์ ๋ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ ํผ๋ฒ๊ณผ ๋ฐ๊ฟ์ค๋ค๋ฉด ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ๋ค, ์ค๋ฅธ์ชฝ์ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ๋ค๋ก ์ ๋ ฌ์ด ๋๋ค.
ํต ์ ๋ ฌ ์์ค์ฝ๋
array = [3,4,1,5,2,3,5,7]
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]:
left+=1
while right > start and array[right] >=array[pivot]:
right-=1
if left > right:
array[pivot], array[right] = array[right], array[pivot]
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(array)
ํ์ด์ฌ์์๋ง ๊ฐ๋ฅํ ํต ์ ๋ ฌ ๋ํ ์กด์ฌํ๋ค. ์ด๋ ๊ธฐ์กด์ ํต ์ ๋ ฌ๋ณด๋ค๋ ์ฐ์ฐ ํ์๊ฐ ๋ง์ง๋ง ์ง๊ด์ ์ด๊ณ ๊ตฌํ๊ฐ๊ธฐ๊ฐ ์ฝ๋ค.
ํ์ด์ฌ ์ ์ฉ ์์ค์ฝ๋
array = [2,3,1,4,9]
def quick_sort(array):
if len(array) <=1:
return array
pivot = array[0]
tail = array[1:]
left_side = [x for x in tail if x<=pivot]
right_side = [x for x in tail if x>pivot]
return quick_sort(left_side) + [pivot] + quick_sort(right_sort)
print(quick_sort(array))
ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ N๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ฉด, N๋ฒ๋์ ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ๊ณ ์ด๋ฅผ ๋ถํ logN๋ฒ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ํต ์ ๋ ฌ์ N X logN์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ฐ๋ฅธ๋ค. ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๋ ๊ฒ์ ๋์ด๋ก ์ ์ ์๋๋ฐ, N๊ฐ๊ฐ ๊ฐ๋ก, logN์ด ์ธ๋ก๋ผ๊ณ ๋ดค์ ๋ ๋๊ฐ๊ฐ ๊ณฑํ ๊ฒ๋งํผ ์ฐ์ฐํ์๊ฐ ์๊ธด๋ค. ์ด๋ ์ ํ์ ๋ ฌ๊ณผ ์ฝ์ ์ ๋ ฌ์ ๋นํด ๊ทน๋ช ํ ์๋์ฐจ์ด๊ฐ ์์์ ์ ์ ์๋ค. ํต ์ ๋ ฌ์ ํ๊ท ์ ์ผ๋ก O(NlogN)์ ๋ฐ๋ฅด์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋์ํ ์ ์๋ค. ๋ฐ๊พธ์ง ์์๋ ๋๋ ์๋ฅผ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์ ํ์ ๋ ฌ๊ณผ ๊ฐ์ด O(N^2)์ธ ๊ฒฝ์ฐ์ด๋ค.
'์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค > ์ ๋ ฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด(Python ๊ตฌํ)- ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค. (0) | 2020.08.27 |
---|---|
์ ๋ ฌ ๋ฌธ์ (์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ)-Python (0) | 2020.08.27 |
์์์ ์๋๋ก(์ ๋ ฌ ๋ฌธ์ )-Python (0) | 2020.08.27 |