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 类型,但实际应用中可能需要更精细的控制。
相关推荐
WindSearcher23 分钟前
大模型微调相关知识
后端·算法
取酒鱼食--【余九】33 分钟前
rl_sar实现sim2real的整体思路
人工智能·笔记·算法·rl_sar
Magnum Lehar2 小时前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎
水蓝烟雨2 小时前
[面试精选] 0094. 二叉树的中序遍历
算法·面试精选
超闻逸事3 小时前
【题解】[UTPC2024] C.Card Deck
c++·算法
暴力求解3 小时前
C++类和对象(上)
开发语言·c++·算法
JKHaaa3 小时前
几种简单的排序算法(C语言)
c语言·算法·排序算法
让我们一起加油好吗3 小时前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
FogLetter3 小时前
微信红包算法揭秘:从随机性到产品思维的完美结合
算法
YGGP4 小时前
吃透 Golang 基础:数据结构之 Map
开发语言·数据结构·golang