基数排序(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八大排序之基数排序的更多相关文章

  1. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  2. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  3. 八大排序算法——基数排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演 二.思路分析 基数排序第i趟将待排数组里的每个数的i位数放到tempj(j=1-10)队列中,然后再从这十个队列中取出数据,重新放到原数组里,直到i大于待排数的最大位数. 1.数组里的数最 ...

  4. java八大排序代码

    import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...

  5. 必须知道的Java八大排序算法

    冒泡排序.简单选择.直接插入.快速排序.堆排序.希尔排序.归并排序.基数排序. 将其按排序方式分类如下图所示: 1.冒泡排序: 基本思想——在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上 ...

  6. Java八大排序之希尔(Shell)排序

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  7. Java八大排序之插入排序

    插入排序 也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中. 步骤: 假设有一组数组为(数组下标0—n-1): ar ...

  8. Java八大排序之堆排序

    堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 根据根结点是否是最 ...

  9. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

随机推荐

  1. [LeetCode] 834. Sum of Distances in Tree 树中距离之和

    An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges are given. The ith edge co ...

  2. [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

  3. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

      Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i. ...

  4. Spring Boot Admin2.X监控的服务context-path问题

    在使用Spring Boot Admin进行监控时,如果被监控的服务没有加context-path的话是不会有任何问题的,一旦服务加了context-path的配置,监控就会失败. 下图是正常情况的显 ...

  5. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  6. FutureTask源码2

    @SuppressWarnings({"unchecked","restriction"}) public class FutureTask1<V> ...

  7. HTML+css基础 标签的起名 style标签 选择器的使用规则

    标签的起名: 1. 官方提供的标签名 2. 类名: 用class属性起的名字 3. Id名: 用id属性起的名字 唯一的 我们把这种起名叫选择器 class选择器 id选择器  标签选择器 style ...

  8. 『Pushbox 点双联通分量』

    Pushbox Description 周婧涵和她的小伙伴们发明了一个新游戏.游戏名字很准确,但不是特别有 创意.她们称之为"推动箱子在谷仓周围找到正确的位置,不要移动干草"游戏 ...

  9. JavaIO学习:打印流

    打印流 打印流是输出信息最方便的类,注意包含字节打印流:PrintStream和字符打印流:PrintWriter. 打印流提供了非常方便的打印功能,可以打印任何类型的数据信息,例如:小数,整数,字符 ...

  10. javascript中的异步操作以及Promise和异步的关系

    https://segmentfault.com/a/1190000004322358 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和强大 https://se ...