[java] 계수 정렬 알고리즘

계수 정렬은 정렬 알고리즘 중 하나로, 일반적으로 정수 형태의 데이터를 정렬하는 데 사용됩니다. 이 알고리즘은 비교 정렬 알고리즘과 달리 비교를 통해 요소를 정렬하지 않으며, 데이터의 특정 범위에 대한 빈도수를 계산하여 정렬을 수행합니다.

알고리즘 동작 방식

  1. 가장 큰 값 찾기: 정렬할 데이터 중 가장 큰 값의 크기를 구합니다.
  2. 빈도수 계산: 0부터 최대값까지의 빈도수를 기록할 임시 배열을 생성하고, 각 값의 빈도수를 계산합니다.
  3. 누적 빈도수 계산: 각 값의 누적 빈도수를 계산합니다.
  4. 정렬 배열 구성: 누적 빈도수를 이용하여 정렬된 배열을 구성합니다.

예시 코드

public class CountingSort {
    void sort(int[] arr) {
        int max = Arrays.stream(arr).max().getAsInt();
        int[] count = new int[max + 1];
        int[] output = new int[arr.length];

        for (int value : arr) {
            count[value]++;
        }

        for (int i = 1; i <= max; i++) {
            count[i] += count[i - 1];
        }

        for (int i = arr.length - 1; i >= 0; i--) {
            output[count[arr[i]] - 1] = arr[i];
            count[arr[i]]--;
        }

        System.arraycopy(output, 0, arr, 0, arr.length);
    }
}

계수 정렬은 데이터 범위가 크지 않을 때, 또한 데이터가 정수 형태일 때 가장 효율적으로 동작합니다. 그러나 데이터의 범위가 매우 크고 실수 형태일 경우에는 추가적인 고려가 필요합니다.

이는 안정 정렬(Stable sort)이며, 시간 복잡도는 O(n+k)입니다. 여기서 k는 데이터의 최대값에 해당하는 범위를 의미합니다.

참고 자료