title: 桶排序算法(基于Java实现)
tags: 桶排序算法


桶排序算法的原理和代码实现

一、桶排序算法的原理

桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。

利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

整个桶排序算法过程:

①设置一个定量的数组当作空桶;

②遍历输入数据,并且把数据一个一个放到对应的桶里去;

③对每个不是空的桶进行排序;

④从不是空的桶里把排好序的数据拼接起来。

二、桶排序算法的代码实现

package Sort;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;//桶排序
public class BucketSort2 {public static void bucketSort(int[] a) {int min = a[0];int max = a[0];for (int i = 0; i < a.length; i++) {max = Math.max(max, a[i]);min = Math.min(min, a[i]);}System.out.println("最大值为:"+max);System.out.println("最大值为:"+min);//桶数int bucketNum = a.length;//这里的处理很巧妙//声明并初始化一个ArrayList,用来存放桶的个数,以及桶中的数据。ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);for (int i = 0; i < bucketNum; i++) {bucketArr.add(new ArrayList<Integer>());}//将每个元素放入桶中for (int i = 0; i < a.length; i++) {//加1是为了保证index < a.length,防止程序抛出IndexOutofBoundsEX//这里就是一个比例问题,就是看一下a[i]是属于哪一个桶的,因为这里的桶数是数组a的长度。int num = (int)((a[i] - min) / (max - min + 1) * a.length);bucketArr.get(num).add(a[i]);}//对每个桶进行排序for (int j = 0; j < bucketArr.size(); j++) {Collections.sort(bucketArr.get(j));}//合并数据int k = 0;for(ArrayList<Integer> arr : bucketArr){for(int i : arr){a[k++] = i;}}}public static void main (String[] args){int[] a = {9012, 19702, 398867, 68957, 83556, 102456, 56789, 324567, 556666, 899932, 12345, 432567};//int[] a = {6, 11, 3, 9, 8};System.out.println("之前的排序:");System.out.println(Arrays.toString(a));bucketSort(a);System.out.println("之后的排序:");System.out.println(Arrays.toString(a));}
}

输出的结果为:

之前的排序:
[9012, 19702, 398867, 68957, 83556, 102456, 56789, 324567, 556666, 899932, 12345, 432567]
最大值为:899932
最大值为:9012
之后的排序:
[9012, 12345, 19702, 56789, 68957, 83556, 102456, 324567, 398867, 432567, 556666, 899932]

三、桶排序算法的性能分析

如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素。每个桶内部使用快速排序,时间复杂度为 O(k * logk)。m 个桶排序的时间复杂度就是 O(m * k * logk),因为 k=n/m,所以整个桶排序的时间复杂度就是 O(n*log(n/m))。当桶的个数 m 接近数据个数 n 时,log(n/m) 就是一个非常小的常量,这个时候桶排序的时间复杂度接近 O(n)

桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

桶排序算法(基于Java实现)相关推荐

  1. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...

    史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...

  2. 十大排序算法(Java)

    文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...

  3. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  4. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  5. java实现选择排序 带打印,选择排序算法的JAVA实现

    选择排序算法的JAVA实现 package Utils.Sort; /** *利用选择排序法对数组排序,数组中元素必须实现了Comparable接口. */ public class ChooseSo ...

  6. php桶排序,PHP实现桶排序算法

    本篇讲解PHP实现桶排序算法. 简单意义上的桶排序: 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话. 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内.数据一定是在范围N内的. ...

  7. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang;import java.util.Arrays;/*** Created by admin on 2017/1/20.*/ p ...

  8. 经典排序算法(Java版)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...

  9. 鸡尾酒排序算法(java)

    欢迎关注WX公众号: 鸡尾酒排序算法(java) ####文章链接 知识点 1.鸡尾酒排序算法介绍: 2.算法的实现java: 概述 鸡尾酒算法:就是把一组数字,分别向前和向后将每个最大(最小)的数字 ...

最新文章

  1. Codeforces 396A 数论,组合数学
  2. php把数组组成xml,php 怎么将数组转xml的函数?
  3. R语言生成螺旋形(spirals)仿真数据实战:螺旋线型线性不可分数据集、螺旋线型不可分数据集可视化、为散点图中的每个数据点添加类标签信息
  4. 马哥第3期运维班第二周作业
  5. 伏安特性实验误差分析_人教高中物理必修第三册《3 实验:电池电动势和内阻的测量》...
  6. [LeetCode] 169. Majority Element 多数元素
  7. 大学慕课数据结构单元测试——华中科技大学
  8. CUDA Eclipse Nsight 不能打开工程 an error has occurred see the log file
  9. 七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)
  10. HttpModule,HttpHandler 简介
  11. php 405跳转,php采用curl访问域名返回405 method not allowed提示的解决方法
  12. postman 指定响应格式_牛鹭学院:Postman接口测试方法,新手必看!
  13. SpringBoot整合Redis及Redis工具类撰写
  14. groupmod 修改用户组信息
  15. 泛微OA二次开发环境搭建 ecology二次开发
  16. NetBeans常用命令总结
  17. 《道德经》新解(上篇)
  18. android如何app主题更换,通过EventBus更换android app主题
  19. 【自动控制原理仿真实验】 稳定性及稳态误差实验(实验三)
  20. 【计算机网络】第一章:计算机网络概述

热门文章

  1. Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
  2. iOS证书及ipa包重签名探究
  3. ios常见加密解密方法
  4. 如何从功能测试转化自动化测试?
  5. mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解
  6. Linux 的相关介绍
  7. docker portainer_Docker入门详解(十一) 图形Portainer
  8. 5教程 watchout_Unit 5单元复习学案设计
  9. java语言用什么编程_使用什么编程语言开发Java?
  10. 巴克码matlab,matlab编写巴克码