当前位置: 首页 > news >正文

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]] 范围内均匀分布。
    • 创建一个 ArrayList 的 ArrayList 来存储桶,每个桶也是一个 ArrayList
  2. 分配元素到桶中
    • 遍历数组中的每个元素,根据元素的值计算它应该属于哪个桶,并将其添加到相应的桶中。
  3. 对每个桶进行排序
    • 使用 Collections.sort 方法对每个桶进行排序。
    • 将排序后的桶中的元素依次放回原数组中。

注意事项:

  • 桶排序适用于数据分布均匀的情况。如果数据分布不均匀,可能会导致某些桶中的元素过多,从而影响性能。
  • 桶的数量和桶的大小对性能有很大影响,需要根据具体情况进行调整。
  • 桶排序在处理浮点数时需要注意精度问题,上面的例子使用了 double 类型,但实际应用中可能需要更精细的控制。


http://www.mrgr.cn/news/48202.html

相关文章:

  • Javascript面试手撕常见题目(回顾一)
  • siglip代码笔记
  • 2024年智能船舶与机电系统
  • zookeeper分布式锁模拟12306买票
  • ES6学习Generator 函数(生成器)(八)
  • PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具
  • 【Kuberntes】kubernets资源类型service详细介绍
  • 10.11作业
  • Redis原理篇之网络模型
  • SpringBoot 集成 Redis 总结
  • 中间件有哪些分类?
  • HW--GaussDB--(一)--老登原来TM是你啊,哈哈!
  • 5.STM32的串口通信
  • 鸿蒙开发(NEXT/API 12)【使用fetch发送网络请求】远场通信服务
  • STM32学习--3-5 光敏控制传感器控制蜂鸣器
  • 【Unity基础】Unity内购支持哪些应用商店?
  • Carrier Aggregation 笔记
  • 基于Maven 运行OpenRewrite的快速示例
  • 探索机器学习中的特征选择技术
  • 【华为】配置RIP协议
  • 【cpp】模板函数 模板类 特化 书写格式备忘
  • 鸿蒙OS开发全面指南:从入门到实战的系统化学习路径
  • 【Redis十二】Redis的典型应用(缓存和分布式锁)
  • 电子取证新视角:USB键盘流量提取密码方法研究与实现
  • 【编程进阶知识】掌握Java线程高效管理:节省资源与提升性能的十大技巧
  • c#代码介绍23种设计模式_23备忘录模式