桶排序算法(基于Java实现)
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实现)相关推荐
- java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
史上最全经典排序算法总结(Java实现) 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗, ...
- 十大排序算法(Java)
文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...
- JAVA十大排序算法动画_十大排序算法(java实现)
[前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...
- 八大排序算法的java实现
八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...
- java实现选择排序 带打印,选择排序算法的JAVA实现
选择排序算法的JAVA实现 package Utils.Sort; /** *利用选择排序法对数组排序,数组中元素必须实现了Comparable接口. */ public class ChooseSo ...
- php桶排序,PHP实现桶排序算法
本篇讲解PHP实现桶排序算法. 简单意义上的桶排序: 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话. 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内.数据一定是在范围N内的. ...
- 几种简单的排序算法(JAVA)
几种排序算法(JAVA) 一.代码 package com.hdwang;import java.util.Arrays;/*** Created by admin on 2017/1/20.*/ p ...
- 经典排序算法(Java版)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 经典排序 ...
- 鸡尾酒排序算法(java)
欢迎关注WX公众号: 鸡尾酒排序算法(java) ####文章链接 知识点 1.鸡尾酒排序算法介绍: 2.算法的实现java: 概述 鸡尾酒算法:就是把一组数字,分别向前和向后将每个最大(最小)的数字 ...
最新文章
- Codeforces 396A 数论,组合数学
- php把数组组成xml,php 怎么将数组转xml的函数?
- R语言生成螺旋形(spirals)仿真数据实战:螺旋线型线性不可分数据集、螺旋线型不可分数据集可视化、为散点图中的每个数据点添加类标签信息
- 马哥第3期运维班第二周作业
- 伏安特性实验误差分析_人教高中物理必修第三册《3 实验:电池电动势和内阻的测量》...
- [LeetCode] 169. Majority Element 多数元素
- 大学慕课数据结构单元测试——华中科技大学
- CUDA Eclipse Nsight 不能打开工程 an error has occurred see the log file
- 七、Python第七课——有关列表的二三事(切片、切片的遍历和复制)
- HttpModule,HttpHandler 简介
- php 405跳转,php采用curl访问域名返回405 method not allowed提示的解决方法
- postman 指定响应格式_牛鹭学院:Postman接口测试方法,新手必看!
- SpringBoot整合Redis及Redis工具类撰写
- groupmod 修改用户组信息
- 泛微OA二次开发环境搭建 ecology二次开发
- NetBeans常用命令总结
- 《道德经》新解(上篇)
- android如何app主题更换,通过EventBus更换android app主题
- 【自动控制原理仿真实验】 稳定性及稳态误差实验(实验三)
- 【计算机网络】第一章:计算机网络概述
热门文章
- Spring Cloud Alibaba 之 服务通信 REST消息通信:如何使用 OpenFeign 简化服务间通信
- iOS证书及ipa包重签名探究
- ios常见加密解密方法
- 如何从功能测试转化自动化测试?
- mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解
- Linux 的相关介绍
- docker portainer_Docker入门详解(十一) 图形Portainer
- 5教程 watchout_Unit 5单元复习学案设计
- java语言用什么编程_使用什么编程语言开发Java?
- 巴克码matlab,matlab编写巴克码