[c++] 분배정렬

이 알고리즘은 데이터의 분포에 따라 성능이 달라지는 특징을 가지며, 일반적으로 입력범위가 작고 고르게 분포될 때 가장 효율적으로 동작합니다. 분배정렬은 비교없이 데이터들을 바로 정렬할 수 있기 때문에, 비교 기반 정렬 알고리즘들보다 빠를 수 있습니다. 그러나 데이터가 고르게 분포되어 있지 않을 경우에는 메모리 사용량이 많아질 수 있고, 이로 인해 성능이 저하될 수 있습니다.

아래는 C++에서 분배정렬을 구현한 예시 코드입니다.

#include <iostream>
#include <vector>
#include <algorithm>

void bucketSort(std::vector<float>& arr) {
    int n = arr.size();
    std::vector<std::vector<float>> buckets(n);

    // 각 데이터를 버킷에 할당
    for (int i = 0; i < n; i++) {
        int bucketIndex = n * arr[i];
        buckets[bucketIndex].push_back(arr[i]);
    }

    // 각 버킷을 정렬
    for (int i = 0; i < n; i++) {
        std::sort(buckets[i].begin(), buckets[i].end());
    }

    // 정렬된 데이터를 합치기
    int index = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < buckets[i].size(); j++) {
            arr[index++] = buckets[i][j];
        }
    }
}

int main() {
    std::vector<float> arr = {0.8, 0.3, 0.2, 0.6, 0.5, 0.7, 0.1, 0.4, 0.9};
    bucketSort(arr);

    std::cout << "Sorted array: ";
    for (float num : arr) {
        std::cout << num << " ";
    }
    return 0;
}

위의 코드는 주어진 부동소수점 배열을 분배정렬을 사용하여 정렬하는 방법을 보여줍니다. 처음에는 각 값에 따라 적절한 버킷에 할당되며, 그 후에 각 버킷 안의 값들을 정렬하고, 마지막으로 모든 버킷을 순차적으로 합쳐서 정렬된 배열을 얻습니다.