数据结构作业之用队列实现的基数排序(Java版)
题目:
利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求:
1)当数据序列是整数类型的数据的时候,数据序列中每个数据的位数不要求等宽,比 如:
1、21、12、322、44、123、2312、765、56
2)当数据序列是字符串类型的数据的时候,数据序列中每个字符串都是等宽的,比 如:
"abc","bde","fad","abd","bef","fdd","abe"
3)要求重新构建队列的存储表示方法:使其能够将 n 个队列顺序映射到一个数组 listArray 中,每个队列都表示成内存中的一个循环队列【这一项是可选项】
基数排序思想:
以整数为例:先建立十个桶,编号为0-9。然后检测要排序的整数,
从各位数字开始,到数据中存在的最高的位数。根据每一位数字的值把所有要排序的整数放到对应数字的桶中。
比如,整数73 22 93 43 55 14 28 65 39 81。
第一趟:
第二趟:
如果要排序的数字中有更高的位数,必须多次排序。但是这样就比较花时间。所以对于位数相差较大的一串数字的排序,不建议采用基数排序。基数排序的时间复杂度为O(n)。空间复杂度为O(n+bucket)。bucket为桶的数目。故空间复杂度约等于O(n)。当每个桶之后的数字已知的时候,可以把储存基数排序的空间结构变成简单的一维数组。
队列:先进先出特性。push和pop分别入队出队。
具体实现代码:
//Programming in Java
import java.util.*; public class radixSort { private static final HashMap<Character, Integer> alphaToNum = new HashMap(); static {
alphaToNum.clear();
initAlpha2Num('A', 'Z', alphaToNum);
initAlpha2Num('a', 'z', alphaToNum); } private static final void initAlphaToNum(char c1, char c2, HashMap<Character, Integer> map) {
for (char c = c1; c <= c2; c++)
map.put(c, map.size());
} public static void main(String[] args) {
radixSort sortInstance = new radixSort();
int[] data = { 1, 4, 3, 3, 21, 12, 322, 44, 123, 2312, 765, 56, 8978, 10000, 14, 28, 65, 39, 81, 33, 100, 567 };
String[] data2 = { "abc", "Bde", "fad", "abd", "Bef", "fdd", "abe" };
sortInstance.sort(data);
sortInstance.sort(data2); print(data);
print(data2);
} public static void print(String[] data) {
for (int i = 0; i < data.length; i++)
System.out.print(data[i] + " ");
System.out.println();
} public static void print(int[] data) {
for (int i = 0; i < data.length; i++)
System.out.print(data[i] + " ");
System.out.println();
} public void sort(int[] a) {
int N = 10;
ArrayList<Queue<Integer>> qArray;
qArray = new ArrayList();
for (int i = 0; i < N; i++)
qArray.add(new<Integer> LinkedList());// 开辟空间
int max = Integer.MIN_VALUE;
for (int i = 0; i < a.length; i++)
max = Integer.max(max, a[i]);
int[] length = new int[N];// 记录qArray的原始长度,防止对元素重复操作
// radix sort
for (int i = 0; i < a.length; i++)
qArray.get(a[i] % 10).offer(a[i]);// 1 step
for (int j = 10; j <= max; j *= 10) {
for (int i = 0; i < N; i++)
length[i] = qArray.get(i).size(); // 2 step update length
for (int i = 0; i < N; i++) {
Queue<Integer> q = qArray.get(i);
while (length[i]-- > 0) {
int num = q.poll();
qArray.get((num / j) % 10).offer(num);
}
}
}
for (int i = 0, AIndex = 0; i < N; i++) // finally
while (qArray.get(i).size() > 0)
a[AIndex++] = qArray.get(i).poll();
} public void sort(String[] s) {
int N = alphaToNum.size();
ArrayList<Queue<String>> qArray;
qArray = new ArrayList();
for (int i = 0; i < N; i++)
qArray.add(new<String> LinkedList());// 开辟空间
int strLen = s[0].length();
int[] length = new int[N];// forbid duplicate operation for (int i = 0; i < s.length; i++)
qArray.get(alphaIndex(s[i].charAt(s[i].length() - 1))).offer(s[i]);
for (int j = strLen - 1; j > 0; j--) {
for (int i = 0; i < N; i++)
length[i] = qArray.get(i).size();
for (int i = 0; i < N; i++) {
Queue<String> q = qArray.get(i);
while (length[i]-- > 0) {
String str = q.poll();
qArray.get(alphaIndex(str.charAt(j - 1))).offer(str);
}
}
}
for (int i = 0, AIndex = 0; i < N; i++) // finally
while (qArray.get(i).size() > 0)
s[AIndex++] = qArray.get(i).poll();
} private int alphaIndex(char c) {
return alphaToNum.get(c);
}
}
ps:阿爸的代码
数据结构作业之用队列实现的基数排序(Java版)的更多相关文章
- 数据结构作业——buzhidao(队列)
buzhidao Description 有一个长度为 n 的序列,第 i 个数的大小为 a[i].现在从第 1 个数开始从左往右进行以下操作:1. 如果当前数是剩下的数中最大的,则输出并删去这个数. ...
- 剑指offer第二版面试题9:用两个队列实现栈(JAVA版)
题目:用两个队列实现栈. 分析:通过一系列的栈的压入和弹出操作来分析用队列模拟一个栈的过程,如图所示,我们先往栈内压入一个元素a.由于两个队列现在都是空,我们可以选择把a插入两个队列中的任一个.我们不 ...
- 数据结构和算法设计专题之---二分查找(Java版)
1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- php数据结构课程---3、队列(队列实现方法)
php数据结构课程---3.队列(队列实现方法) 一.总结 一句话总结: 1.数据实现:适用于功能不复杂的情况 2.链表实现:受限链表,只能队头队尾操作:适用于功能复杂情况 1.队列的数组实现注意点? ...
- Java数据结构和算法(二)--队列
上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...
- 我理解的数据结构(三)—— 队列(Queue)
我理解的数据结构(三)-- 队列(Queue) 一.队列 队列是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结 ...
- 数据结构之双端队列(Deque)
1,双端队列定义 双端队列:其两端都可以入列和出列的数据结构,如下图所示,队列后面(rear)可以加入和移出数据,队列前面(front)可以加入和移出数据 双端队列操作: deque=Deque() ...
随机推荐
- vs2010 在64bits系统下编译
vs只有32bits的没有64bits. 本来程序没问题,后面一直报错 LIBCMTD.lib(close.obj) : error LNK2001 LNK2019 换了各种 MD/MT/MTD 都没 ...
- (转)Tomcat7+Redis存储Session
原创http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831 PS:截止到2015-05-12前是不支持Tomcat8的,详情见官 ...
- python常见数据类型
字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串烦人过程其实很简单,只需为变量分配一个值即可.例如: var = 'Hello Wor ...
- js学习笔记---事件代理
事件机制可以分为捕获型和冒泡型.捕获型是事件由父级元素(DOM)传递到子元素.冒泡型正好相反.事件机制默认为冒泡型.事件机制可以通过参数指定. 事件委托可以将我们绑定在document上的事件自动绑定 ...
- jquery插件开发继承了jQuery高级编程思路
要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...
- JavaOO面向对象中的注意点
1.JavaOO宗旨思想: ★万物皆对象,对象因关注而产生★ ☆类是对象的抽取,对象是类的实例☆ 2.JavaOO的三大特征: 封装.继承.多态 (第四大特征 抽象 现还有争议) 3.属性与行为: ...
- Structs框架
一.准备工作及实例 1.解压struts-2.1.6-all.zip(structs网上下载) apps目录:struts2自带的例子程序 docs目录:官方文档. lib 目录:存放所有jar文件. ...
- DS28E01芯片解密DS28E01-100单片机解密多少钱?
DS28E01芯片解密DS28E01-100单片机解密多少钱? DS28E01-100将1024位EEPROM与符合ISO/IEC 10118-3安全散列算法(SHA-1)的质询响应安全认证结合在一起 ...
- 关于Java导出100万行数据到Excel的优化方案
1>场景 项目中需要从数据库中导出100万行数据,以excel形式下载并且只要一张sheet(打开这么大文件有多慢另说,呵呵). ps:xlsx最大容纳1048576行 ,csv最大容纳1048 ...
- hihoCoder1388 Periodic Signal(2016北京网赛F:NTT)
题目 Source http://hihocoder.com/problemset/problem/1388 Description Profess X is an expert in signal ...