Java基数排序radix sort原理及用法解析

Java基数排序(radix sort)原理及用法解析

简介

基数排序(radix sort)是一种线性时间非比较排序算法。该算法按照元素的每个位数进行排序。

对于待排序的整数集合,基数排序将集合中的元素按照它们的个位、十位、百位……的大小排序(可以理解为在固定位数的情况下逐个进行桶排序)。

基数排序的时间复杂度为 $O(d \cdot (n+k))$,其中 $d$ 是数字的最长位数,$n$ 是待排序数字的数量,$k$ 是桶的个数。

实现思路

  1. 取得数组中的最大数,并取得位数;
  2. arr为原始数组,从最低位开始取每个位组成radix数组;
  3. 对radix进行计数排序(利用计数排序适用于小范围数的特点);

    • 稳定排序:从小到大排序时,计数数组的累加,从大到小排序时,计数数组的逆序累加。
  4. 将前一个排序的数组项,由于排序时用了计数排序,已经是有序的,再次将这个数组,按照下一位重新排序;

  5. 重复步骤4,直到整个数组按照要求有序;

示例

假设我们有以下需要排序的数组:

int[] arr = {53, 3, 542, 748, 14, 214, 154, 63, 616};
  1. 取得数组中的最大数,并取得位数:

```java
int max = arr[0];
for (int i = 1; i < arr.length; i++){
if (arr[i] > max) {
max = arr[i];
}
}

// 取到max值为748,则d=3
int d = 0;
while (max > 0){
d++;
max /= 10;
}
```

  1. 从最低位开始取每个位组成radix数组:

```java
int[][] bucket = new int[10][arr.length];
int[] counts = new int[10];

for (int i = 0, divide = 1; i < d; i++, divide *= 10) {
for (int j = 0; j < arr.length; j++) {
int num = (arr[j] / divide) % 10;
bucket[num][counts[num]] = arr[j];
counts[num]++;
}

  int index = 0;
  for (int j = 0; j < counts.length; j++) {
     if (counts[j] != 0) {
        for (int k = 0; k < counts[j]; k++) {
           arr[index++] = bucket[j][k];
        }
        counts[j] = 0;
     }
  }

}

System.out.println(Arrays.toString(arr));
```

输出结果为: [3, 14, 53, 63, 154, 214, 542, 616, 748]

  1. 排序完成,按照要求有序。

实际应用

基数排序适用于数据范围较小的排序场景,相对于快速排序等算法而言,基数排序的稳定性为优势。

常见应用在整数、字符串等排序需求中,如电话号码排序、字符串排序等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基数排序radix sort原理及用法解析 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JAVA/JSP学习系列之四(Orion App Server的安装)

    下面是“JAVA/JSP学习系列之四(Orion App Server的安装)”的完整攻略: 介绍 Orion是一个免费的Java应用服务器,它支持J2EE标准,并且提供了许多有用的工具和功能。下面是Orion的一些特点:- 完全兼容J2EE标准;- 支持Servlet、JSP、EJB和JMS;- 提供了一个可用的控制台管理;- 提供了集成的用户身份验证和安…

    Java 2023年6月16日
    00
  • form表单数据封装成json格式并提交给服务器的实现方法

    将Form表单数据封装成JSON格式并提交给服务器的实现方法具体分为两个步骤: 获取表单数据并封装成JSON格式 在前端使用JavaScript将表单数据封装成JSON格式,JavaScript中可以使用FormData对象来获取表单数据,再将其转换为JSON格式.以下是封装成JSON格式的示例代码: // 获取表单数据并封装成JSON格式 let form…

    Java 2023年6月15日
    00
  • 详解java数组进行翻转的方法有哪些

    详解Java数组进行翻转的方法有哪些 Java中提供了多种翻转数组的方法,可以通过修改数组元素的顺序或者创建新数组来实现。本文将为大家介绍四种常用的翻转数组的方法。 1. 利用for循环实现 public static int[] reverseArray(int[] array) { int length = array.length; int[] res…

    Java 2023年5月26日
    00
  • java中对象调用成员变量与成员实例方法

    Java 中,对象调用成员变量和成员实例方法的过程是通过对象的引用来实现的。下面是完整的攻略: 对象调用成员变量 首先需要创建一个对象的实例,即对象的地址,然后通过对象的引用来调用成员变量。Java 中的成员变量可以分为类变量和实例变量。对于类变量,直接使用类名来调用即可。对于实例变量,则必须使用对象的引用来调用。 调用类变量 调用类变量可以直接使用类名,例…

    Java 2023年5月26日
    00
  • 使用Java实现DNS域名解析的简单示例

    下面我将为您详细讲解“使用Java实现DNS域名解析的简单示例”的完整攻略。 什么是DNS? DNS(Domain Name System)是一种将域名转换为IP地址的互联网服务。DNS将人类可读的域名转换为机器可读的IP地址。例如,www.baidu.com域名会被DNS服务器解析为IP地址,例如:220.181.110.6。 Java实现DNS域名解析 …

    Java 2023年5月19日
    00
  • Terry七月Ruby读书笔记(比较详细)第2/4页

    你好,针对“Terry七月Ruby读书笔记(比较详细)第2/4页”的完整攻略,我将分享以下内容: 1. 阅读前的准备 在阅读该笔记之前,我们需要先掌握 Ruby 的基本语法知识,并且了解 Ruby 中常用的代码结构和函数库。如果我们对 Ruby 还不是很了解,可以先通过官方文档、教程或者其他学习资源进行学习。 2. 分析文章的结构 在开始阅读该笔记时,我们应…

    Java 2023年5月20日
    00
  • 九种防MDB数据库被下载的方法小结

    九种防MDB数据库被下载的方法小结 在网站开发中,保护数据库的安全性非常重要。本文将会介绍九种防止Microsoft Access数据库(MDB)被下载的方法。 1. 禁止直接访问MDB文件 在Web服务器上,可以关闭对MDB文件的直接访问。可以使用.htaccess(在Apache服务器上)或web.config(在IIS上)来实现此目的。以下是一个web…

    Java 2023年6月15日
    00
  • Java笔记(16) Collection集合–>Set集合–>HashSet

    1. Set接口基本介绍 Set是无序集合(添加和取出的顺序不一致,但取出的顺序是固定的),没有索引 不允许重复元素,所以最多包含一个null JDK API中Set接口的实现类有: Abstract, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, Enum…

    Java 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部