알고리즘

기수 정렬 (Radix Sort)

Younghun 2024. 3. 19. 09:58

 

1. 개요

  • 숫자의 각 자릿수를 기준으로 정렬하는 비교 기반 정렬 알고리즘이 아닌, 분배식 정렬 방법이다.
  • 데이터의 자릿수를 기준으로 순차적으로 정렬을 진행하며, 가장 낮은 자릿수(1의 자리)부터 시작하여 가장 높은 자릿수까지 차례대로 정렬하는 과정을 거친다.
  • 데이터의 크기에 비해 상대적으로 자릿수가 작을 때 좋은 성능을 보인다.

2. 특징

  • 시간복잡도: O(d(n+k))
  • n은 정렬할 요소의 개수, d는 자릿수의 개수, k는 기수(10진수인 경우 10)
  • 공간 복잡도: O(n + k)
  • 기수 정렬은 정렬을 위한 임시 배열 공간을 필요로 한다. 자릿수가 클수록 메모리 사용량이 많아진다.

3. 코드

import java.util.Arrays;

public class RadixSortTest {

	public static void main(String[] args) {
		int[] data = { 170, 45, 75, 90, 802, 24, 2, 66 };

		radixSort(data);

		System.out.println(Arrays.toString(data));
	}

	public static void radixSort(int[] arr) {
		final int RADIX = 10; // 10진수 체계 사용
		int max = arr[0];

		for (int i = 1; i < arr.length; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}

		for (int exp = 1; max / exp > 0; exp *= RADIX) { // exp: 자리수
			countSort(arr, exp);
		}
	}

	private static void countSort(int[] arr, int exp) {
		int[] output = new int[arr.length];
		int[] count = new int[10];

		// count 배열 초기화
		for (int i = 0; i < arr.length; i++) {
			count[(arr[i] / exp) % 10]++;
		}

		// count 배열을 변경하여 실제 위치를 반영하도록 함
		for (int i = 1; i < 10; i++) {
			count[i] += count[i - 1];
		}

		// 결과 배열을 채움
		for (int i = arr.length - 1; i >= 0; i--) {
			output[count[(arr[i] / exp) % 10] - 1] = arr[i];
			count[(arr[i] / exp) % 10]--;
		}

		// 원래 배열에 결과를 복사
		for (int i = 0; i < arr.length; i++) {
			arr[i] = output[i];
		}
	}

}