Radix sort(๊ธฐ์์ ๋ ฌ)์ ๊ธฐ๋ณธ ์์ด๋์ด๋ ๊ฐ๊ฐ ์๋ฆฌ์๋ผ๋ฆฌ ๋น๊ตํด์ ์ ๋ ฌ์ ํ๋ ๊ฒ์ด๋ค. ์๋ฆฟ์๋ฅผ ๋น๊ตํ ๋๋ counting sort
๋ฅผ ์ฌ์ฉ ํ๋ค. Radix sort์ ๋ํด ์ฐพ์๋ณด๋ฉด LSD์ MSD๊ฐ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. LSD๋ ๊ฐ์ฅ ๋ฎ์ ์๋ฆฟ์๋ถํฐ ๋น๊ตํ๋ฉด์ ์ ๋ ฌ์ ํ๋ ๊ฒ์ด๊ณ , MSD๋ ๊ฐ์ฅ ๋์ ์๋ฆฟ์๋ถํฐ ๋น๊ตํ๋ฉด์ ์ ๋ ฌ์ ํ๋ ๊ฒ์ด๋ค. ์๋ฆฟ์๊ฐ ๊ณ ์ ๋์ด์๊ธฐ ๋๋ฌธ์ stable
ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Radix Sort๋ O(kn)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค (k๋ ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ์ ์๋ฆฟ์์ด๋ค). ์ด ์๊ณ ๋ฆฌ์ฆ์ด ์๋ํ๋ ค๋ฉด ๋ช๊ฐ์ง์ ์กฐ๊ฑด๋ค์ด ํ์ํ๋ค:
- ์ซ์์ด์ด์ผ ํ๋ค (ex. ["banana", "apple"] ์ ๊ฐ์ ๋ฆฌ์คํธ๋ ์ ๋ ฌ ๋ถ๊ฐ)
- ๋ถ๋์์ซ์ ์ด ์๋ ์ ์์ฌ์ผ ํ๋ค (ex. [12.332, 29.112] ์ ๊ฐ์ ๋ฆฌ์คํธ๋ ์ ๋ ฌ ๋ถ๊ฐ)
์์ ์กฐ๊ฑด๋ค์ ๋ง์กฑํ์ง ์์ผ๋ฉด Radix sort๋ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ k
์ ํฌ๊ธฐ๊ฐ ํด ์๋ก ์๊ณ ๋ฆฌ์ฆ์ ์๋๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ k
๊ฐ ์์ ์ํฉ์ผ์๋ก ๋ ๋น ๋ฅด๊ฒ ์ ๋ ฌ์ ํ ์ ์๋ค.
๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๋ฅผ ๋ ์ฝ๊ฒ ํ ์ ์๋ค. LSD๋ฅผ ์ฌ์ฉํด์ ์ ๋ ฌ์ ์งํํ ๊ทธ๋ฆผ์ด๋ค.
- ์ฒ์์, ๊ฐ์ฅ ๋ฎ์ 1์ ์๋ฆฌ์๋ค์ ๋น๊ตํด์ ์ ๋ ฌ์ ํ๋ค. ์ด ๋ ์ด ์ซ์๋ค์ ์ ๋ ฌํ ๋
counting sort
๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ ๊ฒฐ๊ณผ 720์ด 355๋ณด๋ค ํผ์๋ 0์ด 5๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ 720์ด ๋ฆฌ์คํธ ์์ ์ค๊ฒ ๋ ๊ฒ์ด๋ค. - ๊ทธ ๋ค์์๋ 10์ ์๋ฆฌ์๋ค์ ๋น๊ตํด์ ์ ๋ ฌ์ ํ๋ค. 457๊ณผ 657์ ๋ณด๋ฉด 10์ ์๋ฆฌ์๊ฐ ์ปค์ ๋ค๋ก ๋ฐ๋ ค๋๊ธด ํ์ง๋ง ์๋ก์ ์์๊ฐ ๋ฐ๋์ง ์์์์ ๋ณผ ์ ์๋ค. ์ด๋ radix sort๊ฐ
stable
ํ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๋๋ ๊ฒ์ด๋ค. - ๋ง์ง๋ง์ผ๋ก 100์ ์๋ฆฌ์๋ค์ ๋น๊ตํด์ ์ ๋ ฌ์ ํ๋ค.
Python Code
class RadixSort:
def __init__(self, num):
self.num = num
def radix_sort(self):
# ์ต๋ digit์ ์์๋ณด๊ธฐ ์ํด ๊ฐ์ฅ ํฐ ์๋ฅผ ์ฐพ๋๋ค
max1 = max(self.num)
exp = 1
while max1/exp > 0:
self.count_sort(self.num,exp)
exp *= 10
def count_sort(self, A, k):
B = [0] * len(A)
C = [0] * (10) # 1์ ์๋ฆฌ, 10์ ์๋ฆฌ์๋ง ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋ฒ์๋ 0~9์ด๋ค
for i in range(0, len(A)): # ๊ฐ element๊ฐ ๋ช๊ฐ์๋์ง C์ ์ ์ฅํ๋ค
index = (A[i]//k)
C[ (index)%10 ] += 1
for i in range(1,10): # C๋ฅผ ๋์ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค, 0~9๊น์ง ๋ฐ์ ์๋ค
C[i] += C[i-1]
i = len(A)-1
while i>=0: # C ๋ฅผ indexingํด์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฐพ๋๋ค
index = (A[i]//k)
B[ C[ (index)%10 ] - 1] = A[i]
C[ (index)%10 ] -= 1
i -= 1
# ๊ธฐ์กด ๋ฆฌ์คํธ์ ๋ณต์ฌ๋ฅผ ํ๋ค
for i in range(len(A)):
A[i] = B[i]
number = [ 170, 45, 75, 90, 802, 24, 2, 66]
print(number)
radix = RadixSort(number)
radix.radix_sort()
print(radix.num)