[CS] 기수 정렬 (Radix Sort)

Jaehyeong Kwon·2023년 4월 6일
0

CS

목록 보기
6/7

기수정렬은 낮은 자리 수부터 비교하여 정렬해 간다는 것을 기본 개념으로 하는 정렬 알고리즘입니다. 기수 정렬은 비교 연산을 하지 않으며 정렬 속도가 빠르지만 데이터 전체 크기에 기수 테이블의 크기만한 메모리가 더 필요합니다.

정렬 방식

  1. 0~9 까지의 Bucket(Queue 자료구조)를 준비합니다.

  2. 모든 데이터에 대하여 가장 낮은 자리 수에 해당하는 Bucket에 차례대로 데이터를 둡니다.

  3. 0부터 차례대로 버킷에서 데이터를 다시 가져옵니다.

  4. 가장 높은 자리 수를 기준으로 하여 자리수를 높여가며 2번 3번 과정을 반복합니다.

아래의 8개 데이터에 대하여 기수 정렬을 시도해 보겠습니다. 위의 그림과 같이 각 숫자에 해당하는 Queue 공간을 할당하고 진행합니다.

먼저 1의 자리 숫자부터 시도를 합니다. 데이터 순서대로 각 1의 자리에 해당되는 Queue에 데이터가 들어가게 됩니다. 15같은 경우는 1의 자리가 5이므로 Queue 5에 들어가는 방식입니다.

위의 그림처럼 다시 0번 Queue부터 차례대로 데이터를 가지고 와서 원래의 배열에 넣어주게 됩니다.
1의 자리에 대한 정렬이 완료되었습니다. 다음으로는 10의 자리에 대하여 같은 작업을 반복합니다.

마찬가지로 각 데이터의 10의 자리에 해당되는 Queue에 데이터를 위치 시킵니다. 그런 다음 0번 Queue부터 차례대로 다시 데이터를 가지고 옵니다.

최종적으로 정렬이 완료가 됩니다.

from collections import deque

def radix_sort(nums):
	buckets = [deque() for _ in range(10)]
   
   max_val = max(nums)
   Q = deque(nums)
   cur_ten = 1
   
   while max_val >= cur_ten:
   	while Q:
         num = Q.popleft()
         buckets[(num // cur_ten) % 10].append(num)
       
       for bucket in buckets:
       	while bucket:
           	Q.append(bucket.popleft())
       
       cur_ten *= 10
       
   return list(Q)

시간 복잡도

  • 시간 복잡도는 O(d * (n + b))
  • d는 최대값의 자리 수, b는 배열의 최대값

특징

장점

  1. 자릿수가 고정되어 있어서 안정성이 있습니다.
  2. 문자열, 정수 정렬이 가능합니다.

단점

  1. 자릿수가 없는 것은 정렬할 수 없습니다. (부동 소숫점)
  2. 중간 결과를 저장할 bucket 공간을 만들기 위한 메모리가 더 필요합니다.
profile
나무와 같이 성장하는 사람

0개의 댓글