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 类型,但实际应用中可能需要更精细的控制。
相关推荐
晚云与城30 分钟前
【数据结构】顺序表和链表
数据结构·链表
FirstFrost --sy2 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森2 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机
搂鱼1145142 小时前
(倍增)洛谷 P1613 跑路/P4155 国旗计划
算法
Yingye Zhu(HPXXZYY)2 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
liulilittle3 小时前
LinkedList 链表数据结构实现 (OPENPPP2)
开发语言·数据结构·c++·链表
无聊的小坏坏3 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
长路 ㅤ   4 小时前
Java后端技术博客汇总文档
分布式·算法·技术分享·编程学习·java后端
秋说4 小时前
【PTA数据结构 | C语言版】两枚硬币
c语言·数据结构·算法
qq_513970444 小时前
力扣 hot100 Day37
算法·leetcode