题目描述
桶排序是一种分布式排序算法,它将元素分到有限数量的桶里,每个桶再分别排序(可能使用别的排序算法或者以递归方式继续使用桶排序)。桶排序的核心思想是将待排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序后,再把每个桶里的数据按照顺序依次取出,组成有序序列。
输入格式
输入共 2 行,第一行是一个整数 n,表示数组的长度。第二行包含 n 个实数,表示待排序的数组。
输出格式
输出共 1 行,包含 n 个实数,表示排序后的数组(升序排列)。
数据范围
1 ≤ n ≤ 10000
0 ≤ 数组元素 ≤ 1
输入样例:
1 2
| 10 0.42 0.32 0.33 0.52 0.37 0.47 0.51 0.36 0.45 0.48
|
输出样例:
1
| 0.32 0.33 0.36 0.37 0.42 0.45 0.47 0.48 0.51 0.52
|
注意事项
- 桶排序的时间复杂度取决于桶内排序的时间复杂度,最坏情况下为 O(n²),平均情况下为 O(n+k),其中 k 为桶的数量。
- 桶排序的空间复杂度为 O(n+k)。
- 桶排序是稳定的排序算法。
- 桶排序特别适合于均匀分布的数据。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <iostream> #include <vector> #include <algorithm> using namespace std;
void bucketSort(double a[], int n) { vector<vector<double>> buckets(10); for (int i = 0; i < n; i++) { int bucket_index = n * a[i]; buckets[bucket_index].push_back(a[i]); } for (int i = 0; i < 10; i++) { sort(buckets[i].begin(), buckets[i].end()); } int index = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < buckets[i].size(); j++) { a[index++] = buckets[i][j]; } } }
int main() { int n; cin >> n; double a[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } bucketSort(a, n); for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; return 0; }
|
时间复杂度
- 时间复杂度:平均情况下为 O(n+k),其中 n 为数组的长度,k 为桶的数量。最坏情况下为 O(n²)(当所有元素都被分到同一个桶中时)。
- 空间复杂度:O(n+k)。
代码解释
- 桶排序的核心思想是将待排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。
- 在这个实现中,我们创建了10个桶,并假设输入的数据是均匀分布在[0, 1)区间内的。
- 我们使用公式 bucket_index = n * a[i] 来计算每个元素应该放入哪个桶中。
- 然后,我们对每个桶内的元素使用STL的sort函数进行排序。
- 最后,我们按照桶的顺序,将每个桶内的元素依次取出,合并到原数组中。