数据结构作业之用队列实现的基数排序(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分别入队出队。

具体实现代码:

  1 //Programming in Java
  2 import java.util.*;
  3
  4 public class radixSort {
  5
  6     private static final HashMap<Character, Integer> alphaToNum = new HashMap();
  7
  8     static {
  9         alphaToNum.clear();
 10         initAlpha2Num(‘A‘, ‘Z‘, alphaToNum);
 11         initAlpha2Num(‘a‘, ‘z‘, alphaToNum);
 12
 13     }
 14
 15     private static final void initAlphaToNum(char c1, char c2, HashMap<Character, Integer> map) {
 16         for (char c = c1; c <= c2; c++)
 17             map.put(c, map.size());
 18     }
 19
 20     public static void main(String[] args) {
 21         radixSort sortInstance = new radixSort();
 22         int[] data = { 1, 4, 3, 3, 21, 12, 322, 44, 123, 2312, 765, 56, 8978, 10000, 14, 28, 65, 39, 81, 33, 100, 567 };
 23         String[] data2 = { "abc", "Bde", "fad", "abd", "Bef", "fdd", "abe" };
 24         sortInstance.sort(data);
 25         sortInstance.sort(data2);
 26
 27         print(data);
 28         print(data2);
 29     }
 30
 31     public static void print(String[] data) {
 32         for (int i = 0; i < data.length; i++)
 33             System.out.print(data[i] + " ");
 34         System.out.println();
 35     }
 36
 37     public static void print(int[] data) {
 38         for (int i = 0; i < data.length; i++)
 39             System.out.print(data[i] + " ");
 40         System.out.println();
 41     }
 42
 43     public void sort(int[] a) {
 44         int N = 10;
 45         ArrayList<Queue<Integer>> qArray;
 46         qArray = new ArrayList();
 47         for (int i = 0; i < N; i++)
 48             qArray.add(new<Integer> LinkedList());// 开辟空间
 49         int max = Integer.MIN_VALUE;
 50         for (int i = 0; i < a.length; i++)
 51             max = Integer.max(max, a[i]);
 52         int[] length = new int[N];// 记录qArray的原始长度,防止对元素重复操作
 53         // radix sort
 54         for (int i = 0; i < a.length; i++)
 55             qArray.get(a[i] % 10).offer(a[i]);// 1 step
 56         for (int j = 10; j <= max; j *= 10) {
 57             for (int i = 0; i < N; i++)
 58                 length[i] = qArray.get(i).size(); // 2 step update length
 59             for (int i = 0; i < N; i++) {
 60                 Queue<Integer> q = qArray.get(i);
 61                 while (length[i]-- > 0) {
 62                     int num = q.poll();
 63                     qArray.get((num / j) % 10).offer(num);
 64                 }
 65             }
 66         }
 67         for (int i = 0, AIndex = 0; i < N; i++) // finally
 68             while (qArray.get(i).size() > 0)
 69                 a[AIndex++] = qArray.get(i).poll();
 70     }
 71
 72     public void sort(String[] s) {
 73         int N = alphaToNum.size();
 74         ArrayList<Queue<String>> qArray;
 75         qArray = new ArrayList();
 76         for (int i = 0; i < N; i++)
 77             qArray.add(new<String> LinkedList());// 开辟空间
 78         int strLen = s[0].length();
 79         int[] length = new int[N];// forbid duplicate operation        for (int i = 0; i < s.length; i++)
 80             qArray.get(alphaIndex(s[i].charAt(s[i].length() - 1))).offer(s[i]);
 81         for (int j = strLen - 1; j > 0; j--) {
 82             for (int i = 0; i < N; i++)
 83                 length[i] = qArray.get(i).size();
 84             for (int i = 0; i < N; i++) {
 85                 Queue<String> q = qArray.get(i);
 86                 while (length[i]-- > 0) {
 87                     String str = q.poll();
 88                     qArray.get(alphaIndex(str.charAt(j - 1))).offer(str);
 89                 }
 90             }
 91         }
 92         for (int i = 0, AIndex = 0; i < N; i++) // finally
 93             while (qArray.get(i).size() > 0)
 94                 s[AIndex++] = qArray.get(i).poll();
 95     }
 96
 97     private int alphaIndex(char c) {
 98         return alphaToNum.get(c);
 99     }
100 }

ps:阿爸的代码

时间: 2024-08-02 07:03:17

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

栈和队列常见题型(java版)

直接上干货..... 栈和队列常见题型: 实现栈和实现队列. 两个栈实现一个队列. 设计栈,使得pop,push和min时间复杂度为O(1). 滑动窗口的最大值. 栈的进出序列. 实现栈和实现队列 主要包括:栈,队列,循环队列. package com.sywyg; /** * 实现栈 * 数组应该是Object类型的 * 注意top的设置影响出栈和获取栈顶元素. * size也可以用top代替 */ class MyStack<E>{ // 栈元素个数 private int size; /

16. 蛤蟆的数据结构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:"社会犹如一条船 ,每人都要有掌舵的准备.--易卜生" 我们来看下基数排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47760601 1.  基数排序 基数排序(radix sort)属于"分配式排序"(distributionsort),又称"桶子法"(bucket sort)或bin sort,顾名思义,

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TshingHua OJ-旅行商TSP)

做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(TSP) Description Shrek is a postman working in the mountain, whose routine work is sending mail to n villages. Unfortunately, road between villages is

数据结构作业之数组

/* 编程作业 2.1 向highArray.java程序(清单2.3)的HighArray类添加一个名为getMax()的方法,它返回 数组中最大关键字的值,当数组为空时返回-1.向main()中添加一些代码来使用这个方法. 可以假设所有关键字都是正数. 2.2 修改编程作业2.1中的方法,使之不仅返回最大的关键字,而且还将该关键字从数组中删除. 将这个方法命名为removeMax(). 2.3 编程作业2.2中的removeMax()方法提供了一种通过关键字值进行数组排序的方法.实现一个 排

数据结构(九)——队列

数据结构(九)--队列 一.队列简介 队列是一种特殊的线性表,仅能在两端进行操作,队头可以进行区数据操作,队尾进行插入数据操作.队列的特性是先进先出.队列的操作包括创建队列.销毁队列.入队.出队.清空队列.获取队头元素.获取队列的长度. 二.队列的实现 1.队列的抽象类 template <typename T> class Queue:public Object { public: virtual void add(const T& value) = 0;//进队列 virtual

第03次作业-栈和队列

第03次作业-栈和队列 1.学习总结 2.PTA实验作业 2.1题目一 7-3 表达式转换(25 分) 2.2 设计思路(伪代码或流程图) 定义变量result[100]存储需要输出的式子. 定义变量str[100]存储输入的表达式 for i=0 to strlen(str) if(str[i] 为 '-' 并且 str[i-1]不是数字) then result[r++]=str[i]; elseif (str[i]不是数字) then while str[i]为数字或为"." d

java程序代码代写、代写tree数据结构作业

java程序代码代写.代写tree数据结构作业实验三:java面向对象编程一.实验目的及要求1.理解 Java 语言是如何体现面向对象编程基本思想的:2.掌握类的声明以及对象的创建:3.了解类的成员变量和成员方法的特性以及类的构造方法的使用. 4.掌握类变量与实例变量以及类方法和实例方法的区别.二.实验内容1. 编写程序模拟两个村庄共同拥有一片森林.编写一个Village类,该类有一个静态的int型成员变量treeAmount用于模拟森林中树木的数量.在主类MainClass的方法中创建两个村庄