문제 11 · 실습 — 버킷 정렬
[0, 1) 구간에 균등 분포uniform distribution한 실수 배열을 버킷 정렬bucket sort로 정렬합니다. 값을 버킷에 고르게 분산 → 각 버킷 정렬 → 이어 붙이기의 세 단계를 확인하세요.
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// [0, 1) 구간에 균등 분포한 실수에 대한 버킷 정렬
vector<double> bucketSort(vector<double> a) {
int n = a.size();
vector<vector<double>> buckets(n);
for (double x : a) // 값에 비례해 버킷 배정
buckets[(int)(n * x)].push_back(x);
for (auto& b : buckets) // 각 버킷 내부 정렬
sort(b.begin(), b.end());
vector<double> out; // 버킷 순서대로 이어 붙임
for (auto& b : buckets)
for (double x : b) out.push_back(x);
return out;
}
int main() {
vector<double> a = {0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68};
vector<double> s = bucketSort(a);
cout << "정렬 결과: ";
for (double x : s) cout << x << ' ';
cout << '\n';
return 0;
}출력은 정렬 결과: 0.12 0.17 0.21 0.23 0.26 0.39 0.68 0.72 0.78 0.94 입니다. 값이 [0,1)에 고르게 퍼져 있어 각 버킷에 원소가 골고루 나뉘고, 이때 평균 시간 복잡도는 O(n)입니다. 값이 한 구간에 몰리면 한 버킷에 집중되어 O(n²)까지 나빠집니다.