Java关于桶排序的知识点总结

作者:laozhang 时间:2023-12-06 03:18:04 

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文从最简单的一个排序算法——桶排序开始,分析桶排序的实现思路,代码实现,性能特点以及适用场景。

0、其他排序算法索引

https://www.jb51.net/article/120879.htm

1、桶排序思想

一个简单例子:

对6个人的英语测试成绩(1~10分)进行排序。假如分数是[6,5,8,8,10,9],用桶排序的思想就是准备10个桶,编号依次为1~10,将成绩放入对应的桶中,例如6分放入6号桶,两个8分放入8号桶...然后按照桶的标号顺序逐一输出(有就输出,没有就不输出),这就是桶排序的基本思想。

事实上,这只是一个简易版,试想一下,如果待排序的元素跨度范围比较大,例如1~10000,是不是需要10000个桶?实际上这种情况下,一个桶里并非总放一个元素,很多时候一个桶里放多个元素。其实真正的桶排序和散列表有一样的原理。

实际排序中,通常对每个桶中的元素继续使用其他排序算法进行排序,所以更多时候,桶排序会结合其他排序算法一起使用。

2、桶排序代码

在分析了桶排序的思想后,首先要知道待排序元素的范围,以上述为例,声明一个长度为10的数组作为10个桶,然后将成绩逐一往桶中放时,该桶的值+1,最终输出倒序输出数组下标,数组每个位置的值为几就输出几次,这样就能实现基本的桶排序。


public class BucketSort {
 private int[] buckets;
 private int[] array;

public BucketSort(int range,int[] array){
   this.buckets = new int[range];
   this.array = array;
 }

/*排序*/
 public void sort(){
   if(array!=null && array.length>1){
     for(int i=0;i<array.length;i++){
       buckets[array[i]]++;
     }
   }
 }

/*排序输出*/
 public void sortOut(){
   //倒序输出数据
   for (int i=buckets.length-1; i>=0; i--){
     for(int j=0;j<buckets[i];j++){
       System.out.print(i+"\t");
     }      
   }
 }
}

测试代码:


public class SortTest {
 public static void main(String[] args) {
   testBucketsSort();
 }

private static void testBucketsSort(){
   int[] array = {5,7,3,5,4,8,6,4,1,2};
   BucketSort bs = new BucketSort(10, array);
   bs.sort();
   bs.sortOut();//输出打印排序
 }
}

3、桶排序性能特点

桶排序实际上只需要遍历一遍所有的待排元素,然后依次放入指定的位置。如果加上输出排序的时间,就要遍历所有的桶。因此桶排序的时间复杂度是O(n+m),n是待排元素的个数,m是桶的个数,也就是待排元素的范围。这个算法算是相当快的排序算法了,但是空间复杂度比较大。

当待排元素的大小范围比较大,但待排元素个数比较少时,空间浪费就比较严重,待排元素分布月均匀,空间利用率越高,事实上这种情况很少见。

通过以上性能分析,可以得出桶排序的特点:速度快且简单,但同时空间利用率较低。当待排数据跨度很大时,空间利用率是无法忍受的。

4、桶排序适用场景

根据桶排序的特点,桶排序一般适用于一些特定的环境,比如数据范围较为局限或者有一些特定的要求,比如需要通过哈希映射快速获取某些值,需要统计每个数的数量。但是这一切都以确认数据的范围为前提,如果范围跨度过大,则考虑用其他算法。

标签:Java,桶排序
0
投稿

猜你喜欢

  • Android程序开发中单选按钮(RadioGroup)的使用详解

    2023-09-18 03:43:39
  • android实现简单底部导航栏

    2022-07-10 16:11:08
  • Spring自动注入失败的解决方法

    2022-08-13 03:41:31
  • Android学习教程之圆形Menu菜单制作方法(1)

    2022-05-23 03:08:50
  • C#利用iTextSharp组件给PDF文档添加图片/文字水印

    2021-11-03 20:18:31
  • Android ListView滑动改变标题栏背景渐变效果

    2022-07-01 04:00:59
  • Spring存储与读取Bean对象方法

    2021-11-12 03:35:27
  • Java动态 代理的应用详解

    2023-11-25 08:15:24
  • 细品Java8中hashCode方法的使用

    2023-10-04 14:01:19
  • C#实现Socket通信的解决方法

    2022-06-01 22:06:00
  • java并发编程之深入理解Synchronized的使用

    2023-10-11 09:21:13
  • springboot整合@Retryable实现重试功能的示例代码

    2023-11-27 11:08:20
  • Unity代码实现序列帧动画播放器

    2023-03-24 23:48:45
  • 详解使用SSM实现简单工作流系统之实现篇

    2021-10-21 07:49:23
  • ios百度地图的使用(普通定位、反地理编码)

    2023-07-03 15:26:17
  • springcloud-gateway整合jwt+jcasbin实现权限控制的详细过程

    2023-11-20 12:57:09
  • 关于WPF异步MVVM等待窗体的介绍

    2022-08-03 00:54:19
  • Android开发之利用Activity实现Dialog对话框

    2022-12-25 21:13:00
  • Android 中ScrollView嵌套GridView,ListView的实例

    2023-06-15 15:49:56
  • JAVAlogback日志管理详解

    2023-01-11 22:33:54
  • asp之家 软件编程 m.aspxhome.com