基数排序 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. Linux下redis的安装

    第一部分:安装redis 希望将redis安装到此目录 /usr/local/redis 希望将安装包下载到此目录 /usr/local/src 那么安装过程指令如下: $ mkdir /usr/lo ...

  2. ps 文字处理篇

    ps文字处理篇 1.对文字镂空处理并且移除到新图像上: 首先创建图层-文字编辑-横排编辑 其次 魔棒工具选择通过颜色来选择选区 右击图层-栅格化图层 删除键将选择的颜色删除留下选区- 复制粘贴到另一个 ...

  3. 那些年一起用过的iOS开发利器之Code Pilot

    本系列所有工具的简介见:http://www.cnblogs.com/lloydsheng/p/3637606.html 什么是Code Pilot? Code Pilot是一个Xcode的扩充套件, ...

  4. JS中的函数声明错误

      这个问题是JS的函数声明形参部分不带var. ( 额,基础不扎实.)

  5. USACO翻译:USACO 2014 JAN三题(1)

    USACO 2014 JAN 一.题目概览 中文题目名称 滑雪场设计 滑雪降速 滑雪场评级 英文题目名称 skidesign slowdown skilevel 可执行文件名 skidesign sl ...

  6. iOS用的aes

    http://files.cnblogs.com/files/n1ckyxu/NickyAesTool.zip 使用方法 #define encryptKey @"你的加密密码" ...

  7. Implicit and Explicit Multithreading MULTITHREADING AND CHIP MULTIPROCESSORS

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The concept of thread ...

  8. Windows重启网络命令

    netsh winsock reset ipconfig /flushdns

  9. Yii2中数据过滤方案

    1. 将数据赋值给model对象再通过model保存数据到数据库时有两种方法. 1) load()再save(). 这种可以通过$model->setScenario('test_scenari ...

  10. Canvas 知识体系简单总结

    Canvas 知识体系简单总结 标签(空格分隔): HTML5 Canvas 本文原创,如需转载,请注明出处 前言 知识点零零散散,一个上午整理了一下,内容不多,方便记忆. 本文不是教程,如需教程移步 ...