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

时间:2023-03-08 16:52:29

题目:

利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第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。

第一趟:

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

第二趟:

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

如果要排序的数字中有更高的位数,必须多次排序。但是这样就比较花时间。所以对于位数相差较大的一串数字的排序,不建议采用基数排序。基数排序的时间复杂度为O(n)。空间复杂度为O(n+bucket)。bucket为桶的数目。故空间复杂度约等于O(n)。当每个桶之后的数字已知的时候,可以把储存基数排序的空间结构变成简单的一维数组。

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

队列:先进先出特性。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:阿爸的代码

相关文章