Sorting
๐จ โ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋คโ ๊ต์ฌ ์ ๋ฆฌ
์ ๋ ฌ
์ ๋ ฌ์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ๋๋ถ๋ถ ์ธ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๋ฏธ ํจ์จ์ ์ธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์๋ ๊ฒ๋ ๊ธฐ์ ๋ฉด์ ์๋ ๋ง์ด ๋ฑ์ฅํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ค์ํ๋ค๊ณ ํ๋ค.
์ ํ ์ ๋ ฌ
๊ฐ์ฅ ๋จ์ํ๊ณ ์ง๊ด์ ์ผ๋ก ๋ ์ฌ๋ฆด ์ ์๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐฐ์ด์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ ํํด ์ฐจ๋ก๋๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
data = [3,6,7,1,2,9,10,4,5,8]
def selection_sort():
for i in range(len(data)):
idx = i
for j in range(i,len(data)):
if data[idx] > data[j]:
idx = j
data[idx],data[i] = data[i],data[idx]
selection_sort()
print(data)
์ ํ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ด๋ค. ํจ์จ์ ์ด๋ผ๊ณ ๋ ํ ์ ์๋ค.
์ฝ์ ์ ๋ ฌ
์ฝ์
์ ๋ ฌ์ ์์์ ๋ถํฐ ์ ๋ ฌํ์ฌ ๊ฐ ์์๊ฐ ๋ค์ด๊ฐ ์๋ฆฌ๋ฅผ ์ฐพ์ ํด๋น ์์น์ ์ฝ์
ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. n๋ฒ์ฌ ์์๊ฐ ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ๋๋ค๋ฉด 0 ๋ถํฐ n-1 ๋ฒ์งธ ๊น์ง์ ์์๋ฅผ ์ฐจ๋ก๋๋ก ํ์ธํ๋ค. ์์์๋ถํฐ ์ ๋ ฌ์ด ์งํ๋๊ธฐ ๋๋ฌธ์ data[:n] ์ ์์๋ค์ ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ์ด๋ค. ๋ฐ๋ผ์ n๋ฒ์ฌ ์์๊ฐ ๋ค์ด๊ฐ ์์น๋ ํด๋น ์์๋ณด๋ค ํฐ ์๋ฅผ ๋ง๋ ๊ทธ ์์น์ ๋ฃ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
data = [3,6,7,1,2,9,10,4,5,8]
def insertion_sort():
for i in range(1,len(data)):
for j in range(i,0,-1):
if data[j] < data[j-1]:
data[j],data[j-1] = data[j-1],data[j]
else:
break
insertion_sort()
print(data)
for๋ฌธ์ด 2๋ฒ ์ค์ฒฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ด๋ค. ํ์ง๋ง ์ฝ์ ์ ๋ ฌ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ๋์ด์๋ ์ํฉ์์๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ค. ์ต์ ์ ๊ฒฝ์ฐ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๋ฐ๋ผ์ ๊ทธ๋ด ๊ฒฝ์ฐ ํต ์ ๋ ฌ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋์ํ๋ค.
ํต ์ ๋ ฌ
ํต ์ ๋ ฌ์ ๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฃผ ์์ด๋์ด๋ ๊ธฐ์ค ๊ฐ์ ์ ํด ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๊ฐ๊ณผ ์์ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค. ์ด ๊ธฐ์ค ๊ฐ์ pivot์ด๋ผ๊ณ ํ๋ค.
pivot ๊ฐ ๋ณด๋ค ์์ ๊ทธ๋ฃน๊ณผ pivot ๊ฐ ๋ณด๋ค ํฐ ๊ทธ๋ฃน์ ๋ถํ ํ๋ฉด ๋ ๊ทธ๋ฃน์ pivot ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค. ๊ทธ๋ ๊ฒ ๋ถํ ๋ ๋ ๊ทธ๋ฃน์ ๋ํด์ ๋ค์ํ๋ฒ ์ ๋ ฌ์ ์ํํ๋ ๋ฐฉ์์ด๋ค.
pivot์ ์ด๋ค ๊ฐ์ผ๋ก ์ ํ๋ ๊ฒ์ด ์ ์ ํ์ง๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ๋
ผ๋ฌธ์์ ์ค๋ช
ํ๊ณ ์๋ค. ์ด๋ฒ์๋ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๊ฐ์ pivot์ผ๋ก ์ค์ ํ๋ โํธ์ด ๋ถํ ๋ฐฉ์โ์ผ๋ก ํฌ์คํ
์ ํ๋ค.
data = [3,6,7,1,2,9,10,4,5,8]
def quick_sort(start, end):
if start >= end:
return
pivot = start
left = start+1
right = end
while left <= right:
# pivot ๋ณด๋ค ํฐ ๊ฐ์ด ์ผ์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ค
while left <= end and data[pivot] > data[left]:
left += 1
# pivot ๋ณด๋ค ์์ ๊ฐ์ด ์ค๋ฅธ์ชฝ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ค
while right > start and data[pivot] < data[right]:
right -= 1
# pivot์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ด ๋๋ ์ํ
if left > right:
data[pivot], data[right] = data[right], data[pivot]
else:
data[left], data[right] = data[right], data[left]
# ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๊ทธ๋ฃน ์ฌ์ ๋ ฌ
quick_sort(start, right-1)
quick_sort(right+1, end)
quick_sort(0,len(data)-1)
print(data)
๋ถ๋ถ sorting์ด ํ ๋ฒ ๋ฐ์ํ๋ฉด ์ต์ข
์ ์ผ๋ก right์์น์ pivot๊ฐ์ด ์ด๋ํ๋ฏ๋ก ๋ค์ ๊ทธ๋ฃน sorting์ pivot ๊ฐ์ ์ ์ธํ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๊ทธ๋ฃน์ ์ํํ๋ฉด ๋๋ค.
ํ์ด์ฌ์ ์ต๋๋ก ํ์ฉํ ํต์ํธ ์ฝ๋
data = [3,6,7,1,2,9,10,4,5,8]
def quick_sort_python(data):
if len(data) <=1:
return data
pivot = data[0]
tail = data[1:]
left = [x for x in data if x < pivot]
right = [x for x in data if x > pivot]
return quick_sort_python(left) + [pivot] + quick_sort_python(right)
print(quick_sort_python(data))
ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(NlogN) ์ด๋ค. ์๋นํ ๋น ๋ฅด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ฅ๋์ด์๋ ์ ๋ ฌ ํจ์๋ ํต์ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ํ์ง๋ง ํต์ํธ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด์์ ๊ฒฝ์ฐ pivot ๊ฐ์ ๋ฐ๋ผ ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋์ํ ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋น ๋ฅธ ์ ๋ ฌ์ ์ํด ์ต์ ์ pivot๊ฐ์ ์ ํํจ์ ๋ณด์ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
๊ณ์ ์ ๋ ฌ
๊ณ์์ ๋ ฌ์ ๋ฐฑ์ค์์ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ๋ช ๋ฒ ๋ณธ์ ์ด ์๋๋ฐ, (๋ฐฑ์ค ๋ฌธ์ ๋งํฌ) ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ์ฑ ์์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์ ์์ ๋๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋๋ง ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ์ ์ฐจ์ด๊ฐ 1,000,000์ ๋์ง ์์ ๋ ํจ๊ณผ์ ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ ์์ด๋์ด๋ n ๊ฐ์ ์ซ์๊ฐ ์๋ค๋ฉด ๊ฐ์ฅ ํฐ ์ ๋งํผ ํฌ๊ธฐ์ ๋ฐฐ์ด์ ๋ง๋ค์ด 0์ผ๋ก ์ฑ์ฐ๊ณ ๋ฐ๋ณต๋ฌธ์ ํ ๋ฒ ์ํํ๋ฉด์ ํด๋น ์ซ์์ ํด๋นํ๋ index๋ฅผ ์ฆ๊ฐ์์ผ ์ด ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
data = [3,6,7,1,2,9,10,4,5,8]
count = [0]*(max(data)+1)
for i in data:
count[i]+=1
for i in range(len(count)):
for j in range(count[i]):
print(i,end=' ')
๋งค์ฐ ๊ฐ๋จํ๋ค! ๊ณ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(N+K)์ด๋ค. (K๋ ๋ฐ์ดํฐ์ ์ต๋๊ฐ) ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ๋ง์ด ์ค๋ณต๋์ด ์์ ์๋ก ์ ๋ฆฌํ๋ค.
๊ฒฐ๋ก
์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํญ์ O(NlogN)์ ๋ณด์ฅํ๋ค. ๋ฐ๋ผ์ ๋จ์ ์ ๋ ฌ ์์ ์๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๋ฐ์ดํฐ์ ๋ฒ์๊ฐ ํ์ ์ ์ด๊ณ ๋ ๋น ๋ฅด๊ฒ ๋์ํด์ผ ํ ๋๋ ๊ณ์ ์ ๋ ฌ์ ์ฌ์ฉํ์.