基数排序 java 实现

Wikipedia: Radix sort

geeksforgeeks: Radix sort

数学之美番外篇:快排为什么那样快

Java排序算法总结(八):基数排序

排序八 基数排序

算法概念

基数排序(radix sort)是一种非比较型整数排序算法,不同于比较排序算法(例如:堆排序、归并排序、快速排序),它不需要比较关键字的大小,而是根据关键字中各位的值,通过对排序的N个关键字进行若干趟“分配”与“收集”来实现排序的。根据其原理,基数排序不仅适用于整数排序,还可以进行字符串(比如名字或日期)和特定格式的浮点数排序。基数排序是稳定性的排序,在某些时候,基数排序法的效率高于其它的比较性排序法。

算法思想

基数排序可以分为两类:最高位优先(Most Significant Digit first)法和最低位优先(Least Significant Digit first)法。LSD法从最低位到最高位来对关键字进行处理,MSD法反之。

以LSD法为例:

  1. 取得每个整数的个位数值(最低位)。
  2. 将所有整数按取得的个位数值进行分组,分组过程中,同组整数保持其在原队列里的顺序(保证了算法的稳定性)。
  3. 按每位数对队列进行重复分组,最终得到一个有序队列。

算法实现

package com.lygedi.sort;

import java.util.ArrayList;
import java.util.List; public class RadixSort {
public void sort(int[] a){
List[] bucket = new List[10]; for(int i=0;i<10;i++){
List<Integer> al = new ArrayList<Integer>();
bucket[i] = al;
} int maxDigit = 1;
int currentDigit = 1;
int n = 1; while(currentDigit<=maxDigit){
for(int i=0;i<a.length;i++){
int p = a[i];
if(currentDigit==1){
int temp = (int) Math.ceil(Math.log10(p));
if(temp>maxDigit){
maxDigit = temp;
}
} int radix = (p / n) % 10;
bucket[radix].add(p);
} int index = 0;
for(int i=0;i<10;i++){
ArrayList<Integer> al = (ArrayList<Integer>) bucket[i];
for(int j=0;j<al.size();j++){
a[index] = (int) al.get(j);
index++;
}
al.clear();
} for(int i=0;i<a.length;i++){
System.out.print(a[i]);
System.out.print(",");
}
System.out.println(currentDigit); currentDigit++;
n *= 10;
}
} public static void main(String[] args) {
int a[]={49,38,1,100,1000,1165,9,76,13,4127,49,8,34,10,12,649,49,56,200,412,762,98,97,100,55,
51,13,5,4,62,99,98999,54,56,179,17,18,11123,34,56,15,35,25,53,51,0,12013,732,999999,89,
853202,2342,3,20,1,201,1000,10000,100000,38,29,1234567,3,381,23,123,9123,1,2,12397,861}; RadixSort qs = new RadixSort();
qs.sort(a); System.out.println(a.length);
for(int i=0;i<a.length;i++)
System.out.println(Integer.toString(i)+"-"+a[i]);
}
}

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

  1. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  2. 基数排序---Java实现+C++实现

    基数排序是基于桶排序实现的,总之基本思想是:先基于个位进行桶排序,更新原序列:再基于十位进行桶排序,更新原序列-- code1:java import java.util.*; public clas ...

  3. 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)

    转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html  比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...

  4. 基数排序——Java实现

    一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...

  5. java各种排序实现

    排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列. 对一个排序算法来说,一般从下面3个方面来衡量算法的优劣: 时间复杂度:它 ...

  6. 各种排序算法及其java程序实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想 ...

  7. 20172302 《Java软件结构与数据结构》第五周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 教材学习内容总结 查找 查找即在某项目组中寻找某一指定目标元素,或确定该组中并不存在此元素.对其进行查找的项目组称为查找池. 1. ...

  8. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  9. 排序算法及其java实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...

随机推荐

  1. Ubuntu14.04安装Ubuntu Tweak

    第一步:添加tweak源 sudo add-apt-repository ppa:tualatrix/ppa 第二步:更新 sudo apt-get update 第三步:安装ubuntu-tweak ...

  2. ubuntu安装配置elasticSearch(vagrant)

    安装jdk sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java s ...

  3. Hadoop_UDAF示例

    UDAF: 多进一出 GenericUDAFEvaluator : 就是根据job的不同阶段执行不同的方法 Hive通过GenericUDAFEvaluator.Modle来确定job的执行阶段 PA ...

  4. windows快捷键集锦

    输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是8090,首先找到它. 查看被占用端口对应的PID,输入命令:netstat -aon|findstr &q ...

  5. centos 安装 opencv-3.1.0

    官方安装教程 http://docs.opencv.org/3.1.0/d9/d52/tutorial_java_dev_intro.html#gsc.tab=0 注意要先安装jdk和apache a ...

  6. iOS CoreAnimation 核心动画

    一 介绍 一组非常强大的动画处理API 直接作用在CALAyer上,并非UIView(UIView动画) CoreAnimation是所有动画的父类,但是不能直接使用,应该使用其子类 属性: dura ...

  7. git SourceTree常用操作

    1.git 修改用户名以及提交邮箱 修改用户名和邮箱有两种方式,第一种 git 修改当前的project的用户名的命令为:git config user.name 你的目标用户名;  git 修改当前 ...

  8. AsyncTask内的各个方法调用顺序

    |- AsyncTask内的各个方法调用顺序:|- 首先,用户调用execute方法,启动AsyncTask .然后在execute方法中:|- 首先调用onPreExecute方法,执行初始化操作. ...

  9. c# json TO xml

    using System.IO;using System.Text;using System.Xml.Serialization;using System.Xml;using System.Runti ...

  10. ASP.NET TextBox 当鼠标点击后清空默认提示文字[转]

    前台文本框里添加下面2个事件属性: OnFocus="javascript:if(this.value=='提示文字') {this.value=''}" OnBlur=" ...