桶排序代码:

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实现桶排序和基数排序的更多相关文章

  1. 由Maximum Gap,对话桶排序,基数排序和统计排序

    一些非比较排序 在LeetCode中有个题目叫Maximum Gap.是求一个非排序的正数数列中按顺序排列后的最大间隔.这个题用桶排序和基数排序都能够实现.以下说一下桶排序.基数排序和计数排序这三种非 ...

  2. 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)

    转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html  比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...

  3. 桶排序与基数排序代码(JAVA)

      桶排序 publicstaticvoid bucketSort(int[] a,int max){         int[] buckets;           if(a==null || m ...

  4. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  5. java-数组排序--计数排序、桶排序、基数排序

    计数排序引入 不难发现不论是冒泡排序还是插入排序,其排序方法都是通过对每一个数进行两两比较进行排序的,这种方法称为比较排序,实际上对每个数的两两比较严重影响了其效率,理论上比较排序时间复杂度的最低下限 ...

  6. java,桶排序,冒泡排序,快速排序

    1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...

  7. Java算法 -- 桶排序

    桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序 ...

  8. Java实现桶排序

    public class BucketSort { public static void main(String[] args) { int[] list = {1000, 192, 221, 12, ...

  9. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

随机推荐

  1. 【Git】git rebase报错new blank line at EOF.处理

    执行git rebase报错如下: First, rewinding head to replay your work on top of it... Applying: 本次提交信息 .git/re ...

  2. tomcat 网页管理tomcat

    一.设置管理员账户密码 进入tomcat安装目录 ->进入conf目录->修改user.xml->加入下面内容 模板 <role rolename="manager- ...

  3. buildah---github简单记录

    github里着重讲了buildah和podman的区别: buildah对标的是dockerfile的脚本化代替执行. podman对标的是docker命令的代替. gihub地址: https:/ ...

  4. skopeo---github简单记录

    新的redhat 8已默认不集成docker,而是使用podman了. podman和skopeo和buildah,cri-o一起,组成了新一代的容器四大天王. 花时时间了解下,是值得的. skope ...

  5. 快速从一个空虚拟机,空idea打通提交spark

    https://www.cnblogs.com/xxbbtt/p/8143593.html #!/bin/bash # Install Spark on CentOS 7 yum install ja ...

  6. 浏览器音频兼容和ffmpeg的音频转码使用

    浏览器对各音/视频格式的支持问题 浏览器测试效果图 ffmpeg在音频格式转换,和从视频中提取音频的简单实用 1.百度搜索浏览器对于音频文件的兼容,排在前面的文章大部分是复制粘贴很久以前的文章,容易误 ...

  7. docker-compose yaml mysql和wordpress 一行命令搞定~~~

    version: '3.1' services: db: container_name: db image: mysql/mysql-server restart: always networks: ...

  8. Java中超大文件读写

    如果文件过大不能一次加载,就可以利用缓冲区: File file = new File(filepath); BufferedInputStream fis = new BufferedInputSt ...

  9. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  10. 如何在电脑上配置两个tomcat

    问题 准备逐渐转向idea的怀抱了,每次部署项目时和eclipse使用的都是同一个tomcat,这是很大的隐患,并且非常的不方便,遂再配置一个tomcat 1.下载tomcat和配置系统变量 CATA ...