1 package ahe.sort;

2

3 import java.io.BufferedReader;

4 import java.io.IOException;

5 import java.io.InputStreamReader;

6 import java.util.LinkedList;

7

8 /**

9 * 基数排序算法

10 *

11 * @author Johness

12 *

13 */

14 public class RadixSort {

15

16 /** 主队列 */

17 private LinkedList mainQueue;

18 /** 子队列 */

19 private LinkedList[] subQueues;

20 /** 子队列个数,作用不大 */

21 private final int SIZE = 10;

22 /** 当前容器(主队列)中存储数值的最大位数 */

23 private int maxDigits;

24

25 /** 构造函数 */

26 public RadixSort() {

27 mainQueue = new LinkedList();

28 subQueues = new LinkedList[SIZE];

29 for(int i = 0; i < SIZE; ++i)

30 subQueues[i] = new LinkedList();

31 maxDigits = 0;

32 }

33

34 /** 向容器中(主队列)添加一个数值 */

35 public void add(Integer num) {

36 int digits = String.valueOf(num).length();

37 if (digits > maxDigits)

38 maxDigits = digits;

39 mainQueue.add(num);

40 }

41

42 /** 排序 */

43 public void sort() {

44 for (int i = 1; i <= maxDigits; ++i) {

45 while (mainQueue.size() > 0) {

46 Integer element = (Integer) mainQueue.pop();

47 String elementTmpStr = String.valueOf(element);

48 if (elementTmpStr.length() < i) {

49 subQueues[0].add(element);

50 continue;

51 }

52 int digit = elementTmpStr.charAt(elementTmpStr.length() - i) - '0';

53 subQueues[digit].add(element);

54 }

55 //listSubQueues();

56 for (int j = 0; j < SIZE; ++j) {

57 mainQueue.addAll(subQueues[j]);

58 subQueues[j].clear();

59 }

60 //listMainQueue();

61 }

62 }

63

64 /*==============================================================================================*/

65 // 以下方法为测试方法(以下方法来自于Arizona State University学校课后作业,本人只做翻译,如该资源侵犯了您的权益,请及时联系我)

66 // 您可以访问

67 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/Assignment11.java

68 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/Sorting.java

69 // 查看本文参考内容

70 // 本文输入输出对照表可从该课后作业中获得

71 // 输入表

72 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/input1.txt

73 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/input2.txt

74 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/input3.txt

75 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/input4.txt

76 // 输出表

77 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/output1.txt

78 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/output2.txt

79 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/output3.txt

80 // https://courses.eas.asu.edu/cse205/current/assignments/assignment11/output4.txt

81 /*==============================================================================================*/

82 /**

83 * 列举(输出)主队列数据

84 */

85 public void listMainQueue() {

86 System.out.println("mainQueue = " + listQueue(mainQueue) + "\n");

87 }

88

89 /**

90 * 列举(输出)子队列数据

91 */

92 public void listSubQueues() {

93 String result = "";

94 for (int i = 0; i < SIZE; i++) {

95 result += "subQueue[" + i + "]:";

96 result += listQueue(subQueues[i]);

97 result += "\n";

98 }

99 System.out.println(result);

100 }

101

102 /**

103 * 列举某队列中数据项

104 *

105 * 方法使用了一个临时队列来完成数据轮循

106 * 先从目标队列中逐个取出(采用取出并删除的方式)放入临时队列并做列举操作(连接到返回字符串)

107 * 待轮循完成后再将临时队列中的数据存入回目标队列

108 *

109 * @param queue 目标队列

110 * @return 包含目标队列中所有数据的字符串

111 */

112 private String listQueue(LinkedList queue) {

113 LinkedList temp = new LinkedList();

114 String result = "{ ";

115

116 while (!queue.isEmpty()) {

117 Integer removed = queue.remove();

118 result += removed + " ";

119 temp.offer(removed);

120 }

121 result += "}\n";

122

123 while (!temp.isEmpty()) {

124 Integer removed2 = temp.remove();

125 queue.offer(removed2);

126 }

127 return result;

128 }

129

130 public static void main(String[] args) {

131 char input1;

132 String inputInfo = new String();

133 String line = new String();

134

135 RadixSort sort1 = new RadixSort();

136

137 try {

138 // 打印菜单

139 printMenu();

140

141 // 创建流读取器读取用户输入

142 InputStreamReader isr = new InputStreamReader(System.in);

143 BufferedReader stdin = new BufferedReader(isr);

144

145 do {

146 System.out.print("你想进行什么操作?\n");

147 line = stdin.readLine().trim(); // 读取一行

148 input1 = line.charAt(0);

149 input1 = Character.toUpperCase(input1);

150

151 if (line.length() == 1) // 检查输入指令是否为单个

152 // 字符

153 {

154 switch (input1) {

155 case 'A': // 添加一个数值

156 System.out.print("请输入要添加的数值:\n");

157 inputInfo = stdin.readLine().trim();

158 int num = Integer.parseInt(inputInfo);

159 sort1.add(num);

160 System.out.print("数值添加成功\n");

161 break;

162 case 'L': // 列举数值

163 sort1.listMainQueue();

164 break;

165 case 'Q': // 退出

166 break;

167 case 'S': // 排序

168 sort1.sort();

169 System.out.print("排序完成\n");

170 break;

171 case '?': // 显示帮助

172 printMenu();

173 break;

174 default:

175 System.out.print("未知指令\n");

176 break;

177 }

178 } else {

179 System.out.print("未知指令\n");

180 }

181 } while (input1 != 'Q' || line.length() != 1);

182 } catch (IOException exception) {

183 System.out.print("IO Exception\n");

184 }

185 }

186

187 /** 打印控制台界面(菜单) */

188 public static void printMenu() {

189 System.out.print("选项\t\t动作\n" + "------\t\t------\n"

190 + "A\t\t添加一个数值\n" + "L\t\t列举队列\n"

191 + "Q\t\t退出\n" + "S\t\t排序数据\n"

192 + "?\t\t显示帮助\n\n");

193 }

194 }

java基数排序简单实现_基数排序简单Java实现相关推荐

  1. java 语言 写字板_一个简单的java语言写字板.docx

    一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...

  2. java单机应用程序_一个简单的java桌面应用:单机版IFTTT

    1.项目背景: ifttt是"if this then that"的缩写,事实上是让你的网络行为能够引发连锁反应.让你使用更为方便.ifttt旨在帮助人们利用各网站的开放API,将 ...

  3. 新手学java 学哪方面_初学者学Java应从哪些方面学习?

    原标题:初学者学Java应从哪些方面学习? Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.那么,初学者学Java应从哪些方面学 ...

  4. java 流的概念_举例讲解Java中的Stream流概念

    1.基本的输入流和输出流 流是 Java 中最重要的基本概念之一.文件读写.网络收发.进程通信,几乎所有需要输入输出的地方,都要用到流. 流是做什么用的呢?就是做输入输出用的.为什么输入输出要用&qu ...

  5. java的移植性_详细介绍JAVA的可移植性

    软件可移植性指与软件从某一环境转移到另一环境下的难易程度.为获得较高的可移植性,在设计过程中常采用通用的程序设计语言和运行支撑环境.尽量不用与系统的底层相关性强的语言.下面介绍JAVA的可移植性. 1 ...

  6. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  7. java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

    本文非原创,翻译自Types of Java Garbage Collectors 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动写垃 ...

  8. java 集成开发工具_最好的Java开发人员测试和集成工具

    java 集成开发工具 通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控. 参加AppDynamics APM导览! 无论您是刚刚起步还是已经从事了一段时间,使用正确的工具进行编程都可 ...

  9. java 不同类型 映射_如何使用Java泛型映射不同的值类型

    java 不同类型 映射 有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为 ...

  10. java整数的因式分解_如何在Java中找到整数的质数-因式分解

    java整数的因式分解 编程课程中的常见家庭作业/任务之一是关于Prime Factorization. 要求您编写一个程序以找到给定整数的素因子 . 一个数字的素数因子是将精确地除以给定数字的所有素 ...

最新文章

  1. 送你一份不正经的深度学习简述(附论文)
  2. java如何添加同名的xml节点_jaxb怎么解析多个同名元素
  3. c++ abort 函数_C ++中带有示例的abort()函数
  4. 组播穿越MPLS ***+SSM
  5. nxos启动的初始化和https访问nx-api
  6. LCFinder 0.3.0 Beta 发布,图像标注与目标检测工具
  7. 剑指offer之二叉搜索树的第K个结点
  8. Nginx教程负载均衡机制
  9. 辐流式重力浓缩池计算_污泥浓缩池工作方式
  10. 用 js 写的 WebSocketHeartBeat,心跳检测
  11. android 显示flash视频播放器
  12. IT行业技术部门人员架构设计
  13. K8S各种各样的证书介绍
  14. Java基础:常用类(String类)
  15. rainmeter频谱动效和动态挂件
  16. BZOJ4987:Tree(树形DP)
  17. 吴军《数学之美》-读书笔记
  18. Deepin系统打开WiFi就不能开热点?三个步骤解决问题
  19. 数据结构 严薇敏 队列 的实现及其使用方法详解
  20. 使用jquery制作漂亮相册集

热门文章

  1. 原力计划·精英季来了!第一周周榜揭晓,你喜欢的博主上榜了吗?
  2. 指令集物联网操作系统 iSysCore OS 2021年将推出 3.0 版本!
  3. OPPO 人像视频黑科技新鲜出炉,下月就换手机!
  4. 响应式布局技术:App如何适配不同尺寸的设备
  5. 真的,没人能逃开“真香定律”
  6. 2020 美国大选在即,又到了 AI 花式打击假新闻的季节
  7. 图解!24 张图彻底弄懂九大常见数据结构!
  8. 首提“智能X效应”,英特尔携手产业加速智能变革
  9. 阿里云智能开放平台团队何登成:解码云计算的 2B 服务基因 | 问底中国 IT 技术演进...
  10. 为什么Linux CFS调度器没有带来惊艳的碾压效果? | CSDN博文精选