基数排序算法的Java实现

1、基数排序算法的简单介绍

关于基数排序算法的介绍有很多资料可以通过很多途径获取。基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。

基数排序算法:

  • 是一种非比较方法实现的排序算法
  • 基数排序算法是一种稳定的排序算法
  • 基数排序算法的时间复杂度: 分配需要O(n),收集为O(r),其中r为分配后链表的个数,以r=10为例,则有0~9这样10个链表来将原来的序列分类。而d,也就是位数(如最大的数是1234,位数是4,则d=4),即"分配-收集"的趟数。因此时间复杂度为O(d*(n+r))。
  • 基数排序算法的空间复杂度:需要额外的辅助空间,在基数排序过程中,对于任何位数上的基数进行“装桶”操作时,都需要n+r个临时空间

2、基数排序算法的基础知识

    基数排序算法是针对每一位进行排序的,所以我们需要对给定的数据准确求出它的每一位数字是多少:

1 //此函数返回整型数i的第k位是什么
2     public static int getFigure(int i, int k) {
3         int[] a = {1, 10, 100, 1000, 10000, 100000};
4         return (i / a[k - 1]) % 10;
5     }

3、基数排序算法的算法思路

  • 设置int[] count 用来存放数组中每一位相同元素的个数值是多少
  • 设置int[] bucket当作桶,用来存取数组,所有桶的个数必须是和数组的长度保持一致
  • 当前数组中元素的最大位数为循环的次数,每次循环都是进行相同的操作
  • 先求出每一个数组元素中当前需要比较的位数值为多少,使用循环来统计在当前比较位的情况下每个桶中数据的数量
  • 利用count[i]来确定放置数据的位置,因为count[i]中存放的是在进行某一位排序的时候,数组中该位为i的所有数的个数,执行完此循环之后的count[i]就是第i个桶最右边界的位置
  • 利用循环把数组中一个个的数据装入各个桶中,注意是从后往前装
  • 将桶中的数据全部取出来,逐一重新赋值给arr
  • 循环重复执行上边的步骤,直到最后求出最终结果。

4、基数排序算法的Java实现

 1 package com.baozi.com.test.paixu;
 2
 3 import java.util.Arrays;
 4
 5 /**
 6  * @author BaoZi
 7  * @create 2019-05-27-11:24
 8  */
 9 public class BitNumberSort {
10     public static void main(String[] args) {
11         //定义整型数组
12         int[] nums = new int[]{21, 56, 88, 195, 354, 1, 35, 12, 6, 7, 4567, 87, 980, 12345};
13         int[] nums1 = new int[]{1,23,345,21,432,324,4563,56789,6543,233};
14         BitNumberSort.lsd_RadixSort(nums1, 5);
15         System.out.println(Arrays.toString(nums1));
16     }
17
18     public static void lsd_RadixSort(int[] nums, int max) {
19         int[] count = new int[10];
20         int[] bucket = new int[nums.length];
21         for (int i = 1; i <= max; i++) {
22
23             for (int k = 0; k < count.length; k++) {
24                 count[k] = 0;
25             }
26
27             for (int k = 0; k < nums.length; k++) {
28                 count[getFigure(nums[k], i)]++;
29             }
30
31             for (int k = 1; k < 10; k++) {
32                 count[k] = count[k] + count[k - 1];
33             }
34
35             for (int k = nums.length - 1; k >= 0; k--) {
36                 int index = getFigure(nums[k], i);
37                 bucket[count[index] - 1] = nums[k];
38                 count[index]--;
39             }
40             for (int k = 0, j = 0; k < nums.length; k++, j++) {
41                 nums[k] = bucket[j];
42             }
43         }
44     }
45
46     private static int getFigure(int i, int j) {
47         int[] a = new int[]{1, 10, 100, 1000, 10000, 100000};
48         return (i / a[j - 1]) % 10;
49     }
50 }

原文地址:https://www.cnblogs.com/BaoZiY/p/10929948.html

时间: 2024-08-09 12:16:13

基数排序算法的Java实现的相关文章

java基数排序算法代码下载

原文:java基数排序算法代码下载 代码下载地址:http://www.zuidaima.com/share/1550463272684544.htm 基数排序:基数排序可以说是扩展了的桶式排序, * 比如当待排序列在一个很大的范围内,比如0到999999内,那么用桶式排序是很浪费空间的. * 而基数排序把每个排序码拆成由d个排序码,比如任何一个6位数(不满六位前面补0)拆成6个排序码, * 分别是个位的,十位的,百位的.... * 排序时,分6次完成,每次按第i个排序码来排. * 一般有两种方

[转]各种排序算法及其java程序实现

原文:http://blog.csdn.net/t12x3456/article/details/7430700 各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想: 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止.2. 排序过程: 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

LRU (Least Recently Used) 算法的Java实现

实现代码如下: import java.util.LinkedHashMap; import java.util.Map; /**  * LRU (Least Recently Used) 算法的Java实现  * @param <K>  * @param <V>  * @author 杨尚川  */ public class LRUCache<K, V> extends LinkedHashMap<K, V> {     //缓存大小     privat

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】

[064-Minimum Path Sum(最小路径和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1