diff --git a/chapter_sorting/bucket_sort.md b/chapter_sorting/bucket_sort.md index e5f4b3e9a..0f53670e9 100644 --- a/chapter_sorting/bucket_sort.md +++ b/chapter_sorting/bucket_sort.md @@ -56,13 +56,56 @@ comments: true === "C++" ```cpp title="bucket_sort.cpp" - [class]{}-[func]{bucketSort} + /* 桶排序 */ + void bucketSort(vector &nums) { + // 初始化 k = n/2 个桶,预期向每个桶分配 2 个元素 + int k = nums.size() / 2; + vector> buckets(k); + // 1. 将数组元素分配到各个桶中 + for (float num : nums) { + // 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + int i = num * k; + // 将 num 添加进桶 bucket_idx + buckets[i].push_back(num); + } + // 2. 对各个桶执行排序 + for (vector &bucket : buckets) { + // 使用内置排序函数,也可以替换成其它排序算法 + sort(bucket.begin(), bucket.end()); + } + // 3. 遍历桶合并结果 + int i = 0; + for (vector &bucket : buckets) { + for (float num : bucket) { + nums[i++] = num; + } + } + } ``` === "Python" ```python title="bucket_sort.py" - [class]{}-[func]{bucket_sort} + def bucket_sort(nums: list[float]) -> None: + # 初始化 k = n/2 个桶,预期向每个桶分配 2 个元素 + k = len(nums) // 2 + buckets = [[] for _ in range(k)] + # 1. 将数组元素分配到各个桶中 + for num in nums: + # 输入数据范围 [0, 1),使用 num * k 映射到索引范围 [0, k-1] + i = int(num * k) + # 将 num 添加进桶 i + buckets[i].append(num) + # 2. 对各个桶执行排序5 + for bucket in buckets: + # 使用内置排序函数,也可以替换成其它排序算法 + bucket.sort() + # 3. 遍历桶合并结果 + i = 0 + for bucket in buckets: + for num in bucket: + nums[i] = num + i += 1 ``` === "Go" @@ -160,7 +203,7 @@ comments: true [class]{}-[func]{bucketSort} ``` -!!! question "桶排序的应用场景是什么?" +!!! question "桶排序的应用场景是什么?" 桶排序一般用于排序超大体量的数据。例如输入数据包含 100 万个元素,由于空间有限,系统无法一次性将所有数据加载进内存,那么可以先将数据划分到 1000 个桶里,再依次排序每个桶,最终合并结果即可。