Java 桶排序

桶排序(Bucket Sort)是一种基于分布的排序算法,它的工作原理是将数组元素分散到有限数量的桶里,然后对每个桶分别进行排序(通常使用其他排序算法,如插入排序),最后依次合并各个桶中的元素,得到排序后的数组。桶排序适用于数据分布均匀的情况,其时间复杂度在最坏情况下是 O(n^2),但在数据均匀分布时,可以达到 O(n + k),其中 n 是数组的大小,k 是桶的数量。

以下是一个简单的 Java 实现桶排序的例子:

复制代码
import java.util.ArrayList;  
import java.util.Collections;  
  
public class BucketSort {  
  
    // 桶排序方法  
    public static void bucketSort(double[] array, int bucketSize) {  
        if (array.length == 0) {  
            return;  
        }  
  
        // 1. 创建桶  
        int bucketCount = (int) Math.floor((array[array.length - 1] - array[0]) / bucketSize) + 1;  
        ArrayList<ArrayList<Double>> buckets = new ArrayList<>(bucketCount);  
        for (int i = 0; i < bucketCount; i++) {  
            buckets.add(new ArrayList<>());  
        }  
  
        // 2. 将数组元素分配到各个桶中  
        for (double num : array) {  
            int bucketIndex = (int) Math.floor((num - array[0]) / bucketSize);  
            buckets.get(bucketIndex).add(num);  
        }  
  
        // 3. 对每个桶进行排序  
        int index = 0;  
        for (ArrayList<Double> bucket : buckets) {  
            Collections.sort(bucket);  
            for (double num : bucket) {  
                array[index++] = num;  
            }  
        }  
    }  
  
    // 测试桶排序  
    public static void main(String[] args) {  
        double[] array = {0.42, 0.32, 0.23, 0.52, 0.77, 0.36, 0.78, 0.31, 0.62, 0.16};  
        int bucketSize = 0.1;  
  
        System.out.println("排序前: ");  
        for (double num : array) {  
            System.out.print(num + " ");  
        }  
        System.out.println();  
  
        bucketSort(array, bucketSize);  
  
        System.out.println("排序后: ");  
        for (double num : array) {  
            System.out.print(num + " ");  
        }  
    }  
}

代码解释:

  1. 创建桶
    • 首先计算桶的数量,这里假设输入数组的元素在 [array[0], array[array.length - 1]] 范围内均匀分布。
    • 创建一个 ArrayListArrayList 来存储桶,每个桶也是一个 ArrayList
  2. 分配元素到桶中
    • 遍历数组中的每个元素,根据元素的值计算它应该属于哪个桶,并将其添加到相应的桶中。
  3. 对每个桶进行排序
    • 使用 Collections.sort 方法对每个桶进行排序。
    • 将排序后的桶中的元素依次放回原数组中。

注意事项:

  • 桶排序适用于数据分布均匀的情况。如果数据分布不均匀,可能会导致某些桶中的元素过多,从而影响性能。
  • 桶的数量和桶的大小对性能有很大影响,需要根据具体情况进行调整。
  • 桶排序在处理浮点数时需要注意精度问题,上面的例子使用了 double 类型,但实际应用中可能需要更精细的控制。
相关推荐
橙几16 分钟前
击败了90%的解法?Two Sum 从 O(n²) 到 O(n) 的优化之路
算法
叶子爱分享31 分钟前
经典排序算法之归并排序(Merge Sort)
算法·排序算法
珹洺36 分钟前
C++算法竞赛篇:DevC++ 如何进行debug调试
java·c++·算法
呆呆的小鳄鱼1 小时前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香1 小时前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely1 小时前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_07121 小时前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_2 小时前
cf1925B&C
数据结构·算法
YuTaoShao2 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
Wendy14419 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归