基数排序的java实现

package com.edu.hpu.sort.radix;

import java.util.LinkedList;
import java.util.List;

import com.edu.hpu.sort.Sort;

public class RadixSort extends Sort {
    private int radix;
    private int d;
    public RadixSort(int radix, int d) {
        this.radix = radix;
        this.d = d;
    }
    @Override
    public int[] doSort(int[] arr) {
        List<Integer>[] bucket = init(radix);
        int [] tmp = new int [arr.length];
        // 控制数字的位
        for(int i = 0; i < d; i++){
            // 取得位数每个数的某一位
            for(int v : arr){
                int d = (int) (v / Math.pow(10, i) % 10);
                bucket[d].add(v);
            }
            // 各个位进行桶排序的结果放入tmp中
            for(int w = 0, j = 0; j < bucket.length && w < tmp.length; j++){
                for(int v : bucket[j]){
                    tmp[w] = v;
                    w++;
                }
            }
            // 处理数组
            arr = tmp;
            for(List<Integer> l : bucket){
                l.clear();
            }
        }
        return arr;
    }
    // 初始化桶
    private List<Integer> [] init(int range){
        @SuppressWarnings("unchecked")
        List<Integer> [] aux = new LinkedList[range];
        for(int i = 0; i < aux.length; i++){
            aux[i] = new LinkedList<Integer>();
        }
        return aux;
    }
    public static void main(String[] args) {
        Sort sort = new RadixSort(10, 3);
        sort.printOrder(new int []{4, 1, 3, 2, 16, 101, 43,200,999,9, 100, 194, 8, 7});
    }
}
时间: 2024-10-05 20:10:36

基数排序的java实现的相关文章

基数排序简单Java实现

基数排序(radix sort)又称“桶子法”,在对多个正整数进行排序时可以使用.它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个). 基数排序使用11个动态数组实现排序算法,一个主队列(下文都将使用的动态数组称为队列)存储未排序的数据(最后排序完成也仍然可以用它存储,或者如果希望保存原来的数据位置则可能需要增加一个队列):10个子队列用于排序过程中动态存放数值,在排序开始前和结束后可以清空. 我们使用LinkedList类来实现基数排序,其实

数据结构作业之用队列实现的基数排序(Java版)

题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列中每个数据的位数不要求等宽,比 如: 1.21.12.322.44.123.2312.765.56 2)当数据序列是字符串类型的数据的时候,数据序列中每个字符串都是等宽的,比 如: "abc","bde","fad","abd",

Java实现基数排序

详细讲解见<2015版数据结构高分笔记>8.6节--基数排序. Java代码如下: package linetimesort; import java.util.LinkedList; import java.util.Objects; /** * 基数排序的思想是多关键字排序 * @author yuncong * */ public class RadixSort { /** * 基于最低位优先方式对一个整型数组排序,数组中整数是d位数: * 以3位整数排序为例,基于最低位优先方式排序的步

算法篇---桶式排序和基数排序

桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大. 排序的具体步骤如下: (1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数: (2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算: buckets[i] = buckets[i] +buckets[i-1] (其中1<=i

使用Java实现八种基本排序

插入排序.选择排序.冒泡排序.希尔排序.堆排序.快速排序.归并排序.基数排序 import java.util.ArrayList; import java.util.List; /** * 排序算法主类 * * @author eric */ class SortArray { /* * [插入排序] * 基本思想: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的, * 现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的, 如此反复循环,直到全部排好顺序

JavaEE学习记录2(JavaOO 知识回顾)

1.super()与this()的区别: this():当前类的对象,super父类的对象.super():在子类访问父类的成员和行为,必须受类继承规则的约束. 而this它代表当前对象,当然所有的资源都可以访问.在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.而在方法中super()和this()使用的方法就差

几种能在O(n*log(n))时间排序

线性时间排序 各种排序算法总结已经介绍了几种能在O(n*log(n))时间内培训n个数的算法.归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.这些算法都有一个有趣的性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类算法为比较算法,还有一类算法是线性时间复杂度的排序算法,有计数排序.基数排序和桶排序,当然,这些算法使用运算而不是比较来确定排序顺序的. 1 计数排序 计数排序假设n个输入元素中的每一个都是0到n区间的一个整数,其中n是某个整数.计数排序的思想是:

算法-java代码实现基数排序

基数排序 第11节 基数排序练习题 对于一个int数组,请编写一个基数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素均小于等于2000. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class RadixSort { 4 // 各位装通法 5 public int[] radixSort(int[] A, in

java基数排序算法代码下载

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