Java实现桶排序和基数排序
桶排序代码:
import java.util.Arrays; /**
* 桶排序
* 工作的原理是将数组分到有限数量的桶里
* 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)
* 桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间O(N)
* 但桶排序并不是比较排序,它不受到O(n log n) 下限的影响
*
* 时间复杂度: O(N+C),其中C=N*(logN-logM)<br />
* 空间复杂度:N+M,M为桶的个数<br />
* 非原址排序<br />
* 稳定性:稳定<br />
*
* 桶排序假设数据会均匀入桶,在这个前提下,桶排序很快!
*/
public class BucketSort { // 根据桶的个数来确定hash函数,这份代码适合桶的个数等于数组长度
static int hash(int element,int max,int length){
return (element * length)/(max+1);
} private static void sort(int[] arr) {
int length = arr.length;
LinkedNode[] bucket = new LinkedNode[length]; // 桶的个数等于length
int max = arr[0]; // 求max
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max) {
max = arr[i];
}
}
// 入桶
for (int i = 0; i < length; i++) {
int value = arr[i]; // 扫描每个元素
int hash = hash(arr[i], max, length); // 桶的下标
if (bucket[hash]==null) {
bucket[hash] = new LinkedNode(value); // 初始化链表
}else {
insertInto(value,bucket[hash],bucket,hash); // 插入链表
}
}
int k = 0; // 记录数组下标
// 出桶,回填arr
for(LinkedNode node:bucket){
if (node!=null) {
while(node!=null){
arr[k++] = node.value;
node = node.next;
}
}
}
} private static void insertInto(int value, LinkedNode head, LinkedNode[] bucket, int hash) {
LinkedNode newNode = new LinkedNode(value);
// 小于头节点,放在头上
if (value<=head.value) {
newNode.next = head;
// 替换头节点
bucket[hash] = newNode;
return ;
}
// 往后找第一个比当前值大的节点,放在这个节点的前面
LinkedNode p = head;
LinkedNode pre = p;
while(p!=null&&value>p.value){
pre = p;
p = p.next;
}
if (p == null) { // 跑到末尾了
pre.next = newNode;
}else { // 插入pre和p之间
pre.next = newNode;
newNode.next = p;
}
} public static void main(String[] args) {
int arr[] = new int[10];
for(int i=0;i<10;i++){
arr[i] = (int) ((Math.random()+1)*10);
}
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
} /**
* 简单单向链表的节点
*
*/
class LinkedNode { public int value;
public LinkedNode next; public LinkedNode(int value) {
this.value = value;
} }
桶排序结果:

基数排序代码:
import java.util.ArrayList;
import java.util.Arrays; /**
* 思路:初始化0-9号十个桶,按个位数字,将关键字入桶,入完后,依次遍历10个桶,按检出顺序回填到数组中
* 然后取十位数字将关键字入桶,入完后,依次遍历10个桶,按检出顺序回填到数组中,假如数组中最大的数为三位数,
* 那么再将百位数字作关键字入桶,这样就能实现基数排序了
* 时间复杂度: 假设最大的数有k位,就要进行k次入桶和回填,每次入桶和回填是线性的,所以整体复杂度为kN,
* 其中k为最大数的10进制位数
* 空间复杂度:桶是10个,10个桶里面存n个元素,这些空间都是额外开辟的,所以额外的空间是N+k,k是进制
* 非原址排序
* 稳定性:假设有相等的元素,它们会次第入桶,次第回数组,不会交叉,所以是稳定的<br />
*/
public class RadixSort {
// 10个桶,每个桶装的数个数不定,适合用数组加ArrayList
private static ArrayList[] bucket = new ArrayList[10]; // 初始化桶
static{
for (int i = 0; i < bucket.length; i++) {
bucket[i] = new ArrayList();
}
} /**
* 将数组arr,按d这个位来分配和收集
*
* @param arr
* @param d
* 位数
*/
private static void sort(int[] arr, int d) {
// 全部入桶
for (int i = 0; i < arr.length; i++) {
putInBucket(arr[i], getDigitOn(arr[i], d));
} /*---每个桶中的元素依次压入原数组---*/
int k = 0;
for (int j = 0; j < bucket.length; j++) {// 每个桶
for (Object m : bucket[j]) {
arr[k++] = (Integer) m;
}
} // 记得清空
clearAll();
} private static void putInBucket(int data, int digitOn) {
switch (digitOn) {
case 0:bucket[0].add(data); break;
case 1:bucket[1].add(data); break;
case 2:bucket[2].add(data); break;
case 3:bucket[3].add(data); break;
case 4:bucket[4].add(data); break;
case 5:bucket[5].add(data); break;
case 6:bucket[6].add(data); break;
case 7:bucket[7].add(data); break;
case 8:bucket[8].add(data); break;
default:bucket[9].add(data);break;
}
} private static void clearAll() {
// 对每个桶调用clear方法进行情况
for (ArrayList b : bucket) {
b.clear();
}
} public static void sort(int[] arr) {
int d = 1;// 入桶依据的位初始化为1
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
} // 最大值 int dNum = 1;// 最大数据的位数
while (max / 10 != 0) {
dNum++;
max /= 10;
} while (d <= dNum) {
// 依据第二个参数入桶和出桶
sort(arr, d++);
}
} public static int getDigitOn(int src, int d) {
return src / (int) (Math.pow(10, d - 1)) % 10;
}
public static void main(String[] args) {
int arr[] = new int[10];
for(int i=0;i<10;i++){
arr[i] = (int) ((Math.random()+1)*10);
}
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
} }
基数排序结果:

Java实现桶排序和基数排序的更多相关文章
- 由Maximum Gap,对话桶排序,基数排序和统计排序
一些非比较排序 在LeetCode中有个题目叫Maximum Gap.是求一个非排序的正数数列中按顺序排列后的最大间隔.这个题用桶排序和基数排序都能够实现.以下说一下桶排序.基数排序和计数排序这三种非 ...
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html 比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...
- 桶排序与基数排序代码(JAVA)
桶排序 publicstaticvoid bucketSort(int[] a,int max){ int[] buckets; if(a==null || m ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- java-数组排序--计数排序、桶排序、基数排序
计数排序引入 不难发现不论是冒泡排序还是插入排序,其排序方法都是通过对每一个数进行两两比较进行排序的,这种方法称为比较排序,实际上对每个数的两两比较严重影响了其效率,理论上比较排序时间复杂度的最低下限 ...
- java,桶排序,冒泡排序,快速排序
1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...
- Java算法 -- 桶排序
桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序 ...
- Java实现桶排序
public class BucketSort { public static void main(String[] args) { int[] list = {1000, 192, 221, 12, ...
- 记数排序 & 桶排序 & 基数排序
为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...
随机推荐
- spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...
- 动态的加载显示oracle警告日志文件内容
Last login: Fri Jan 25 00:37:47 2019 from oracle [root@oracle ~]# su - oracle [oracle@oracle ~]$ sql ...
- figure 的使用
1.figure语法及操作(1)figure语法说明 figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, ...
- selenium数据驱动模式实现163邮箱的登录及添加联系人自动化操作
项目结构如下: 要求python3.0 selenium3.0 下面是代码: appModubles:addContactPersonActtion.py和LoginAction.py addCont ...
- ORACLE安装报错解决
今天在虚拟机中安装了一个WINDOWS系统,用于安装oracle服务器:从安装到使用中出现了很多的问题,把这些问题解决掉,花了不少时间,查了不少的资料. 第一个,我在安装过程中,出现了ORA-0092 ...
- java中的static
1.静态方法 在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: 1. 它们仅能调用其他的static 方法. 2· 它们只能访问s ...
- 百度广告联盟api probuf协议对接
百度的广告API使用的是不是通常的http协议,而是使用谷歌开源出来的probuf协议,具体介绍请参考:https://www.jianshu.com/p/b1f18240f0c7https://ww ...
- Hadoop HDFS安装、环境配置
hadoop安装 进入Xftp将hadoop-2.7.3.tar.gz 复制到自己的虚拟机系统下的放软件的地方,我的是/soft/software 在虚拟机系统装软件文件里,进行解压缩并重命名 进入p ...
- jetbrains 系列 webstorm、IntelliJ Idea 免费激活方法免激活码
方法一: 到网站 http://idea.lanyus.com/ 获取注册码. 方法二:填入下面的license server: http://intellij.mandroid.cn/ http:/ ...
- 组合 数论 莫比乌斯反演 hdu1695
题解:https://blog.csdn.net/lixuepeng_001/article/details/50577932 题意:给定范围1-b和1-d求(i,j)=k的数对的数量 #includ ...