기수 정렬의 전체적인 컨셉은 데이터의 각 자릿수를 낮은 자리수에서부터 가장 큰 자리수까지 올라가면서 정렬을 수행하는 것이다. 이러한 이유로 자릿수가 존재하지 않는 데이터들은 기수정렬로 정렬할 수 없다.
LSD이므로 일의 자릿수부터 확인해서 숫자를 나타내는 버킷에(현재 정수를 정렬하기에 버킷은 숫자를 나타냄) 일의 자릿수를 확인하며 저장함. (일의 자릿수가 2인 친구는 버킷 2에 전부 몰고, 일의 자릿수가 4인 친구는 버킷 4에 전부 몰아줌)
꺼낼 때에는 먼저 저장된 값부터 꺼내게 됨.
일의 자릿수를 몰아준 다음에는 그 다음 자릿수인 십의 자리를 기준으로 버킷에 저장해줌. (나머지 과정은 위와 동일)
마지막 자릿수인 백의 자릿수를 기준으로 버킷에 저장하고 빼줌.
마지막 자릿수까지 검사했다면 오름차순으로 정렬이 완료됨
from collections import deque
def radix_sort(nums):
# 1. 0부터 9까지의 버킷을 생성
buckets = [deque() for _ in range(10)]
# 2. 주어진 숫자들 중 최댓값을 구함
max_val = max(nums)
# 3. 주어진 숫자들을 큐에 저장
Q = deque(nums)
# 4. 현재 자릿수를 나타내는 변수를 초기화
cur_ten = 1
# 5. 최댓값보다 작거나 같은 자릿수까지 반복하여 정렬
while max_val >= cur_ten:
# 6. 큐에 있는 숫자를 꺼내서 해당하는 버킷에 넣음
while Q:
num = Q.popleft()
buckets[(num // cur_ten) % 10].append(num)
# 7. 버킷에 저장된 숫자들을 큐에 다시 넣음
for bucket in buckets:
while bucket:
Q.append(bucket.popleft())
# 8. 다음 자릿수로 이동
cur_ten *= 10
# 9. 정렬된 숫자들을 리스트로 반환
return list(Q)
MSD이기 때문에 가장 큰 자릿수(이 예시에서는 백의 자릿수)부터 확인함
각 숫자를 나타내는 버킷에 백의 자릿수를 확인하며 저장
꺼낼 때는 먼저 저장된 값부터 꺼내게 됨
STEP2부터는 STEP1 과정으로 인해 분류된 그룹끼리 정렬을 수행함
(134, 122)끼리, (224, 232)끼리
두번째 그룹인 (224, 232) 같은 경우는 자릿수를 비교하지 않아도 이미 정렬이 완료된 상태므로 더이상 정렬 안해도 괜찮음
https://soobarkbar.tistory.com/156
https://banjjak1.tistory.com/52
https://jeonyeohun.tistory.com/105
https://hongcoding.tistory.com/187