알고리즘
고급 정렬 알고리즘 구현: 카운팅 정렬 (Java)
개발자0
2025. 3. 10. 23:59

카운팅 정렬
- 비교 기반 정렬이 아니라 데이터의 개수를 세어서 정렬하는 방식
- 데이터의 최대값(K)를 알아야 함
- 데이터가 음수가 포함되면 사용하기 어렵거나 추가적인 조치 필요
- 안정 정렬
시간 복잡도
최선, 평균, 최악 : O(N+K)
단점
실수 정렬 불가능
음수가 포함되면 추가적인 조치 필요
최대값(K)이 너무 크면 비효율적(메모리 사용 증가)
코드(오름차순)
import java.util.Arrays;
public class CountingSort {
public static void countingSort(int[] arr) {
// 최댓값 찾기
int max = Arrays.stream(arr).max().getAsInt();
// 카운트 배열 (0 ~ max)
int[] count = new int[max+1];
// 1. 각 숫자의 개수를 세기
for(int num: arr) {
count[num]++;
}
// 2. 누적합으로 변환하여 정렬된 위치를 결정
for(int i = 1; i <= max; i++){
count[i] += count[i-1];
}
// 3. 정렬된 배열으 만들기(역순으로 처리하여 안정 정렬 유지)
int[] output = new int[arr.length];
for (int i = arr.length - 1; i >= 0; i--) {
output[count[arr[i]] - 1] = arr[i];
count[arr[i]]--; // 같은 숫자가 들어갈 위치를 조정
}
// 4. 원본 배열에 정렬된 값 복사
System.arraycopy(output, 0, arr, 0, arr.length);
}
public static void main(String[] args) {
int[] arr = {4, 2, 2, 8, 3, 3, 1};
countingSort(arr);
System.out.println(Arrays.toString(arr));
}
}