개발/👾 PS

[ 기수 정렬 ] 알고리즘

정소은 2023. 3. 19. 00:58

 

 

1.  개념

      

       기수 정렬 : 기수 정렬은 숫자의 특정 자릿수만 비교하는 정렬인데 일의 자릿수부터 차례대로 하나씩 비교한다

 

 

        * 시간 복잡도 : O(kn)

 

         

          기수 정렬 방법

       

          1 ) 0 ~ 9를 상징하는 10개의 큐를 사용한다

 

          2 ) 데이터를 특정 자릿수의 숫자를 기준으로 큐에 넣는다

 

         3 ) 일의 자릿수부터 마지막 자릿수까지 차례대로 반복하면 된다

 

 

 

2.  문제 풀이

 

# 1  수 정렬하기 - 백준 10989번

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

from collections import deque
N = int(input())
num = []

for i in range(N):
    num.append(int(input()))

def radixSort(nums):
    # 0~9 버킷(큐)
    buckets = [deque() for _ in range(10)]
    
    max_val = max(nums)
    queue = deque(nums)
    
    # 자릿수
    digit = 1 
    
    # 가장 큰 수의 자릿수까지 반복
    while (max_val >= digit):
        # 큐가 빌 때까지
        while queue:
            num = queue.popleft()
            # 특정 자릿수의 숫자를 기준으로 데이터를 버킷에 넣기
            buckets[(num // digit) % 10].append(num)
        
        # 버킷에 담겨있는 순서대로 꺼내기
        for bucket in buckets:
            while bucket:
                queue.append(bucket.popleft())
        
        digit *= 10 # 자릿수 증가시키기
    
    return queue

numList = radixSort(num)
for i in range(N):
    print(numList[i])

 

 

 

 

 

 

 

!참고!

https://10000cow.tistory.com/entry/정렬-7-기수-정렬radix-sort

 

[정렬] 7. 한 살도 이해하는 기수 정렬(radix sort)

기수 정렬 : 주어진 수 들간의 비교를 하지 않고 버킷을 사용해 정렬하는 방법으로, 낮은 자리(1의 자리)에서 높은 자리(10^n 자리) 순으로 버킷에 넣는 방법으로 정렬한다. 실제로 숫자들 간의 비

10000cow.tistory.com