철학과 학생의 개발자 도전기

계수 정렬 (Count Sort) 본문

알고리즘

계수 정렬 (Count Sort)

Younghun 2024. 3. 19. 10:19

1. 개요

  • 계수 정렬은 비교를 사용하지 않는 정렬 알고리즘이다.
  • 정렬해야 할 요소들의 값 범위가 제한적일 때 효과적이다.
  • 정렬하려는 입력 배열에서 각 요소의 발생 횟수를 세고, 이 정보를 바탕으로 각 요소가 정렬된 배열에서 어디에 위치해야 하는지를 결정한다.
  • 작은 정수를 정렬할 때 높은 성능을 보이며, 복잡한 비교 연산 없이 빠르게 정렬을 수행할 수 있다.

2. 특징

  • 시간복잡도: O(n+k)
  • n은 배열의 크기, k는 입력 데이터의 최대값
  • 공간 복잡도: O(k)
  • 각 입력 데이터의 발생 횟수를 저장하기 위한 배열 필요

3. 코드

import java.util.Arrays;

public class CountingSortTest {

	public static void main(String[] args) {
		int[] arr = { 4, 2, 2, 8, 3, 3, 1 };

		countSort(arr);

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

	private static void countSort(int[] arr) {
		int n = arr.length;

		// 배열 arr에서 최대값 찾기
		int max = arr[0];
		for (int i = 1; i < n; i++) {
			if (arr[i] > max) {
				max = arr[i];
			}
		}

		// 각 숫자의 발생 횟수를 저장할 배열(counts) 생성
		int[] counts = new int[max + 1];

		// arr의 각 요소의 발생 횟수를 counts 배열에 저장
		for (int i = 0; i < n; i++) {
			counts[arr[i]]++;
		}

		// counts 배열을 수정하여, 각 요소까지의 누적 발생 횟수를 저장
		for (int i = 1; i <= max; i++) {
			counts[i] += counts[i - 1];
		}

		// 결과를 저장할 배열(output) 생성
		int[] output = new int[n];

		// arr의 요소들을 output 배열에 정렬하여 저장
		for (int i = n - 1; i >= 0; i--) {
			output[counts[arr[i]] - 1] = arr[i];
			counts[arr[i]]--;
		}

		// 정렬된 데이터를 원래의 배열(arr)로 복사
		for (int i = 0; i < n; i++) {
			arr[i] = output[i];
		}
	}

}

'알고리즘' 카테고리의 다른 글

그래프 탐색 (DFS/BFS)  (0) 2024.03.19
이분 탐색 (Binary Search)  (0) 2024.03.19
기수 정렬 (Radix Sort)  (0) 2024.03.19
힙 정렬 (Heap Sort)  (0) 2024.03.12
병합 정렬 (Merge Sort)  (0) 2024.03.05