[c++] 카운팅 정렬

카운팅 정렬(Counting Sort)은 정수 정렬 알고리즘의 하나로, 입력된 숫자들을 세어서 정렬하는 방식입니다. 이 알고리즘은 입력 숫자들이 특정 범위 내에 있을 때 가장 효율적으로 동작합니다. 여기에서는 C++을 사용하여 카운팅 정렬에 대해 설명하겠습니다.

알고리즘 설명

카운팅 정렬은 다음과 같은 단계로 진행됩니다.

  1. 입력 배열을 순회하며 각 숫자가 등장한 횟수를 세어 카운트 배열에 저장합니다.
  2. 카운트 배열을 누적으로 합산하여 각 숫자의 정렬된 위치를 계산합니다.
  3. 임시 배열을 사용하여 정렬된 결과를 생성합니다.

카운팅 정렬은 입력 배열과 카운트 배열의 크기에 비례하는 메모리 공간이 필요하며, 입력 배열의 값들이 양수인 경우에만 동작합니다.

C++ 예시

다음은 C++으로 구현된 카운팅 정렬의 예시 코드입니다.

#include <iostream>
#include <vector>

void countingSort(std::vector<int>& arr, int range) {
    std::vector<int> count(range + 1, 0);
    std::vector<int> output(arr.size(), 0);

    for (int i = 0; i < arr.size(); ++i) {
        count[arr[i]]++;
    }

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

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

    for (int i = 0; i < arr.size(); ++i) {
        arr[i] = output[i];
    }
}

int main() {
    std::vector<int> arr = {4, 2, 2, 8, 3, 3, 1};
    int range = 8;
    countingSort(arr, range);

    for (int num : arr) {
        std::cout << num << " ";
    }

    return 0;
}

위 코드는 입력 배열을 카운팅 정렬하여 오름차순으로 정렬한 후 결과를 출력하는 예시입니다.

카운팅 정렬의 시간복잡도는 O(n + k)로, n은 입력 배열의 크기이고, k는 정렬할 숫자들의 범위입니다.

결론

C++을 사용하여 카운팅 정렬을 적용하여 숫자 배열을 효과적으로 정렬할 수 있습니다. 이 알고리즘은 숫자의 범위가 작을 때 가장 빠르게 동작하므로, 특히 작은 정수들을 정렬할 때 유용합니다.

참고자료