๐ Sound of Sorting
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฅ
- Stable Sorting : ์ค๋ณต๋ ์์์ ์์๊ฐ ์ ๋ ฌ๋ ํ์๋ ์ ์ง๋จ์ด ๋ณด์ฅ๋๋ค.
- Unstable Sorting : ์ค๋ณต๋ ์์์ ์์๊ฐ ์ ๋ ฌ๋ ํ์ ์ ์ง๋จ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
K1, .., K2, .. ์์์ธ ๋ฐฐ์ด์์ ์ ๋ ฌ ํ K1, K2 ์์ด ๋ณด์ฅ๋๋ฉด stable, K2, K1์ผ ์ ์์ผ๋ฉด unstable - in-place: ๋ด๋ถ ์ ๋ ฌ, ์ ๋ ฌ์ ์ํด ์ธ๋ถ ๋ฐฐ์ด์ด ํ์ํ์ง ์๋ค.
- not in-place: ์ธ๋ถ ์ ๋ ฌ, ์ ๋ ฌ์ ์ํด ์ธ๋ถ ๋ฐฐ์ด์ด ํ์ํ๋ค.
๐ฅ ํต์ฌ์ **๊ตํ/์ ํ/์ฝ์ ** ์ด๋ค. ๋๋ถ๋ถ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด ์ธ ๊ฐ์ง ๊ฐ๋ ์ ์์ฉํ๋ค.
1. O(N^2) ์๊ณ ๋ฆฌ์ฆ
1. ๊ตํ ์ ๋ ฌ Exchange Sort
for i in range(0, N-1):
for j in range(i+1, N):
if A[i] < A[j]:
swap(A[i], A[j])
2. ์ฝ์ ์ ๋ ฌ Insertion Sort
๋ชจ๋ i = 0~N-1
์ ๋ํด j = i-1
๋ถํฐ 0์ผ๋ก ๋ด๋ ค๊ฐ๋ฉด์, ๋ง์ฝ A[j] > A[i]
์ด๋ฉด ํ ์นธ ์์ผ๋ก ๋ณต์ฌํ๋ค. ๋ ์ด์ A[i]
๋ณด๋ค ํฐ ๊ฐ์ด ์์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ข
๋ฃํ๊ณ , j+1
ํฌ์ธํฐ ์๋ฆฌ์ A[i]
์ ๋ฃ๋๋ค.
def insertion_sort():
for i in range(1, N):
next = A[i]
for j in range(i-1, -1, -1):
if A[j] > next:
A[j+1] = A[j]
break
A[j+1] = next
3. ์ ํ ์ ๋ ฌ Selection Sort
i = 0~N-2
์ ๋ํด, j = i+1~N-1
์ค ์ต๋๊ฐ์ ๊ณจ๋ผ A[i]
์ swap ํ๋ค.
for i in range(0, N-1):
m = i, min = A[m]
for j in range(i+1, N):
if A[j] < min:
m = j
min = A[j]
swap(A[i], A[m])
4. ๋ฒ๋ธ ์ ๋ ฌ Bubble Sort
j = 0~N-1
์ ๋ํด A[j], A[j+1]
์ ๋น๊ตํ์ฌ ์์ ๊ฐ์ด ์์ ์์ผ๋ฉด swap ํ๋ ๊ฒ์ N๋ฒ ๋ฐ๋ณตํ๋ค.
for i in range(0, N):
for j in range(0, N-1):
if A[j] > A[j+1]:
swap(A[j], A[j+1])
2. O(logN) ์๊ณ ๋ฆฌ์ฆ
1. ๋ณํฉ ์ ๋ ฌ Merge Sort
1. ๋ฐฐ์ด์ ๋ ๋ถ๋ถ L, R ๋ก ๋๋๋ค.
2. ๊ฐ ๋ถ๋ถ์ ์ ๋ ฌํ๋ค.
3. ๋ ๋ฐฐ์ด์ ์์๋๋ก mergeํ๋ค.
i, j, k = 0
while i < j:
L[i]๊ณผ R[j]์ ๋น๊ตํด ์์ ๊ฐ์ M[k]์ ๋๋๋ค.
๋ ์์ ์ชฝ์ ํฌ์ธํฐ๋ฅผ 1 ์ฆ๊ฐํ๋ค.
i > len(L) ์ธ ๊ฒฝ์ฐ
R๋ฐฐ์ด์ ๋จ์ ์์๋ฅผ M์ ๋๋๋ค.
else
L๋ฐฐ์ด์ ๋จ์ ์์๋ฅผ M์ ๋๋๋ค.
M์ merge๋ ๋ฐฐ์ด์ด๋ค.
merge ๊ตฌํ ์ ์กฐ์ฌํ ์
merged ๋ฐฐ์ด์ธ M์ ํจ์ ๋ด ๋ก์ปฌ ๋ณ์๋ก ์ ์ธํ๋ฉด์, ์ ์ด ์ธํ ๊ธธ์ด์ธ N๋งํผ์ ๋ฐฐ์ด์ ์ ์ธํ๋ ๊ฒ์ด ์ค๋ฅ์๋ค. ํญ์ mergeํ ๊ธธ์ด๋งํผ์ ๋ฐฐ์ด๋ง ์ ์ธํ์. (๐ ๊ด๋ จ: ๋ณํฉ ์ ๋ ฌ์ merge ํจ์๋ ๋ด๋น ๋ฒ์๋ณด๋ค ํฐ ์ฐ์ฐ์ ํ์ง ์๋๋ค.)
2. ํต ์ ๋ ฌ Quich Sort
1. ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ pivot์ผ๋ก ์ ํ๋ค.
2. pivot์ ๊ธฐ์ค์ผ๋ก pivot๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถ๋ฆฌํ๋ค.
3. ์ผ์ชฝ ๋ถ๋ถ์ ์ ๋ ฌํ๋ค.
4. ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์ ๋ ฌํ๋ค.
partition ํจ์๋ ๊ฐ๋จํ ํจ์ ๋ด ๋ก์ปฌ ๋ฐฐ์ด L, R์ ์ ์ธํด ์ ๋ ฌํ ๋ค์, L + pivot + R ๋ก ๋ค์ ํฉ์ณ ์ฃผ๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ๊ตํ์ ์ด์ฉํด pivot ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
Is Quick Sort Stable? in-place๋ stable ํ์ง ์๊ณ not in-place๋ stableํ๋ค.
3. ํ ์ ๋ ฌ Heap Sort
What is heap?
๋ถ๋ชจ์ ๊ฐ์ด ์์์ ๊ฐ๋ณด๋ค ํผ/์์์ด ํญ์ ๋ณด์ฅ๋๋ ์ด์ง ํธ๋ฆฌ ํ์์ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๋ถ๋ชจ์ ๊ฐ์ด ์์์ ๊ฐ๋ณด๋ค ํญ์ ํด ๊ฒฝ์ฐ max heap(์ต๋ ํ), ํญ์ ์์ ๊ฒฝ์ฐ min heap(์ต์ ํ) ์ด๋ผ๊ณ ํ๋ค. max heap์ root๋ ํ์ ์ต๋๊ฐ์ด๊ณ , min heap์ root๋ ํ์ ์ต์๊ฐ์ด๋ค.
1. heapify: ๋ฐฐ์ด์ ์ต๋ ํ์ผ๋ก ๋ง๋ ๋ค.
parent = 0~N//2๊น์ง์ ๋
ธ๋์ ๋ํด
while i > N//2
if ์์ ์ค ํฐ ๊ฐ๋ณด๋ค ํฌ๋ฉด ๋ฃจํ ์ข
๋ฃ
else child ์ค ํฐ ๊ฐ์ i์ ๋๋๋ค.
i = i//2 ๋ก ๋ค์ ์์ ๋
ธ๋๋ฅผ ํ์
parent๋ฅผ ๋น ๊ณณ์ ๋๋๋ค A[i//2] = parent
2. ๋ฃจํธ ๋
ธ๋์ ์๋ ๋
ธ๋๋ฅผ swapํ๋ค
3. ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ ์ธํ 0~N-1๊ฐ์ ๋
ธ๋๋ฅผ heapifyํ๋ค.
4. heapifyํ ๋
ธ๋๊ฐ ์์ ๋๊น์ง 2-3 ๋ฐ๋ณต
๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์ ๋ ฌ์ ์์ฉ, ์ฆ N๋ฒ์งธ ์์๋ง๋ค ์ต๋๊ฐ์ ํ์ธํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ทธ๋ฌ๋ ์ต๋๊ฐ์ ์ฐ์ถํ๋ ๊ณผ์ ์์ root = max๋ฅผ ๋ณด์ฅํ๋ heap ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. heapify ํจ์๋ ๋ณต์ก๋๊ฐ O(logN)์ด๋ฏ๋ก, ์ ์ฒด ๋ณต์ก๋๋ O(NlogN)์ด ๋๋ค.
3. What's more?
- Decision Tree
- Sorting by Distribution
- Bucket Sort, Radix Sort (MSD, LSD)
'DevLog ๐จ > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ ์ ๋ ฌ Topological Sorting (0) | 2023.02.14 |
---|