Java八大排序之基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
步骤:
一,求出一个数组中最大的数的位数,表示要排序多少次;
二,先根据个位数排序,个位数相同的放入相同的桶子中,分别对应着0-9的桶子;
三,然后将桶子中的数据重新串连起来,按照0-9的桶子顺序和先进先出的规则;
四,重复第二步和第三步,只是之后的个位数分别设为十位数,百位数,千位数......,直到排序次数完结。
执行过程图:

代码:
public class RadixSort {
//最大数的位数
public static int maxLength(int[] arrays){
int maxArr = arrays[0];
for (int i = 0; i < arrays.length-1; i++){
if (arrays[i] < arrays[i+1]){
maxArr = arrays[i+1];
}
}
return (maxArr+"").length();
}
//排序
public static void radix(int[] arrays){
int i = 0;
int j;
int n = 1;
int index = 0; //数组下标
int l = arrays.length; //数组长度
int max = maxLength(arrays); //最大数的位数
//创建十个桶子数组
int[][] tempArr = new int[10][l];
//每个桶子的定义
int[] counts = new int[10];
while (i <= max){
//把arrays数组中的数据分配到每个数组中
for (j = 0; j < l; j++){
int temp = arrays[j]/n%10;
tempArr[temp][counts[temp]] = arrays[j];
counts[temp]++;
}
//将每个桶子数组中的数据收集到arrays数组中
for (j = 0; j < counts.length; j++){
for (int a = 0; a < counts[j]; a++){
arrays[index] = tempArr[j][a];
index++;
}
counts[j] = 0;
}
index = 0;
n = n*10;
i++;
}
}
//测试
public static void main(String[] args) {
int[] arrays={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
radix(arrays);
System.out.println(Arrays.toString(arrays));
}
}
测试结果:
[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227]
时间复杂度:设待排序列为n个记录,d为最大数的位数,radix为每个位数的取值范围。每次根据位数排序时,都会分为一趟收集和一趟分配,这个时间复杂度为O(n+radix);所以时间复杂度为O(d(n+radix))。
结语:优缺点还是不知道;
Java八大排序之基数排序的更多相关文章
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)
一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...
- java八大排序代码
import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...
- 必须知道的Java八大排序算法
冒泡排序.简单选择.直接插入.快速排序.堆排序.希尔排序.归并排序.基数排序. 将其按排序方式分类如下图所示: 1.冒泡排序: 基本思想——在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上 ...
- Java八大排序之希尔(Shell)排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...
- Java八大排序之插入排序
插入排序 也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中. 步骤: 假设有一组数组为(数组下标0—n-1): ar ...
- Java八大排序之堆排序
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 根据根结点是否是最 ...
- 八大排序算法Java
目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...
随机推荐
- linux-部署1
0.python安装 ubuntu16.04默认:安装了python2.7和python3.5: Ubuntu18.04默认:只有python3.6.8 下面是针对16.04: python/pyth ...
- [LeetCode] 464. Can I Win 我能赢吗
In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...
- 解决VMware虚拟机中centos 7无法上网的问题
在WMware中安装centos 7后发现无法安装软件,开始以为是镜像服务器的问题,后来通过ping之后发现根本没办法连接到网络.由于很多设置都是默认的,并且虚拟机也是NAT模式,和电脑主机共享网络, ...
- oracle--数据库扩容后出现ORA-27102
一,问题描述 Connected to an idle instance. SQL> startup nomount ORA: obsolete or deprecated parameter( ...
- oracle--报错 ORA-01003,ORA-09817,ORA-01075
磁盘满了,删除旧文件,即可保证登入成功
- Mac上Hive安装配置
Mac上Hive安装配置 1.安装 下载hive,地址:http://mirror.bit.edu.cn/apache/hive/ 之前我配置了集群,tjt01.tjt02.tjt03,这里hive安 ...
- java json解析(转)
转自:https://www.cnblogs.com/sunnywindycloudy/p/8343013.html 给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分情况下都是XML格式 ...
- 目标检测 <二> TensorFlow安装
一:创建TensorFlow工作环境目录 1. 在anconda安装目录下找到envs目录然后进入 2. 在当前目录下创建一个文件夹改名为tensorflow 二: 创建TensorFlow工作环境 ...
- javascript判断变量是否为空的方法
javascript判断字符串变量是否为空的方法代码如下<pre> if (typeof(ndesc)=="undefined" || ndesc=='' || nde ...
- 向github项目push代码后,Jenkins实现其自动构建
配置Jenkins(添加Github服务器) 1.进入[系统管理] --> [系统设置] ,找到[Github] 2.添加Github服务器 这里需要github提供一个密钥文本,我们去gith ...