Java 固定长度字符串的排序
我想对整数进行排序。因此,我将它们解释为长度为32的二进制字符串。现在我可以为每个组件应用bucketsort。以下是我的java实现:Java 固定长度字符串的排序,java,bucket,radix-sort,Java,Bucket,Radix Sort,我想对整数进行排序。因此,我将它们解释为长度为32的二进制字符串。现在我可以为每个组件应用bucketsort。以下是我的java实现: public static void sort(List<Integer> numbers) { Queue<Integer> tmp =new LinkedList<Integer>(); for (int i = 0; i < numbers.size(); i++) { tmp.o
public static void sort(List<Integer> numbers)
{
Queue<Integer> tmp =new LinkedList<Integer>();
for (int i = 0; i < numbers.size(); i++) {
tmp.offer(numbers.get(i));
}
List<Integer>[] bucket = new ArrayList[2];
for (int i = 0; i < bucket.length; i++) {
bucket[i] = new ArrayList<Integer>();
}
for (int k = 32; k > 0; k--) {
// Clear
for (int i = 0; i < bucket.length; i++) {
bucket[i].clear();
}
while (!tmp.isEmpty()) {
Integer firstel =tmp.element();
String el =String.valueOf(firstel);
if (el.charAt(k - 1) == 0) {
bucket[0].add(firstel);
} else {
bucket[1].add(firstel);
}
tmp.remove();
}
for (int i = 0; i < bucket.length; i++) {
for (Integer j : bucket[i]) {
tmp.add(j);
}
}
}
}
公共静态无效排序(列表编号)
{
队列tmp=newlinkedlist();
对于(int i=0;i0;k--){
//清楚的
对于(int i=0;i
我不确定我的代码是否正确处理这些二进制字符串。我必须把列表中的整数转换成二进制字符串吗?
注:仅用于练习。关于时间复杂性没有更深的意义。Java已经提供了一个方便的api作为集合框架的一部分。 集合。排序(编号);
这将按升序对整数进行排序。如果您需要不同的排序,您可以使用另一个同样使用Comparator的api。Java已经提供了一个方便的api作为集合框架的一部分。 集合。排序(编号);
这将按升序对整数进行排序。如果您需要不同的排序,您可以使用另一个同样使用Comparator的api。让我们先重写一下,因为不需要队列或tmp arraylist等。第一步,一个让我们编写更少代码的存根类:
private class Numlist extends ArrayList<Integer> {
Numlist() { super(); }
}
有了这种重写,事情就顺利了。我们删除了很多冗长的内容,这使得我们更容易对代码的功能进行推理,并且我们删除了整个“int-to-string-to-substring,然后是char-comparison”,这意味着出错的可能性要小得多
在测试方面,将函数添加到以下类中:
import java.lang.Math;
import java.util.ArrayList;
public class Test {
// private class goes here
public static void main(String[] argv) { new Test(); }
public Test() {
Numlist list = new Numlist();
list.add(10);
list.add(77810);
list.add(4);
list.add(100);
list.add(1);
list.add(290387423);
list.add(23423);
sort(list);
System.out.println(list);
}
// function goes here
}
完成:javac
将愉快地编译它,执行它应该会产生[1,4,10100102342347810290387423]
您还将注意到,我们没有为(int k=31;k>0;k--)使用
,
但是我们为(int k=1;k先重写一下,因为不需要队列或tmp arraylist等。第一步,一个让我们编写更少代码的存根类:
private class Numlist extends ArrayList<Integer> {
Numlist() { super(); }
}
通过重写,一切都正常了。我们删除了很多冗长的内容,这使我们更容易对代码的功能进行推理,我们删除了整个“int到string再到substring,然后是char比较”,这意味着出错的地方少了很多
在测试方面,将函数添加到以下类中:
import java.lang.Math;
import java.util.ArrayList;
public class Test {
// private class goes here
public static void main(String[] argv) { new Test(); }
public Test() {
Numlist list = new Numlist();
list.add(10);
list.add(77810);
list.add(4);
list.add(100);
list.add(1);
list.add(290387423);
list.add(23423);
sort(list);
System.out.println(list);
}
// function goes here
}
完成:javac
将愉快地编译它,执行它应该会产生[1,4,10100102342347810290387423]
您还将注意到,我们没有为(intk=31;k>0;k--)使用
,
,而是为(int k=1;k为什么?字符串转换,然后基数排序和相当慢的字符串提取听起来比仅仅用快速排序或基于位掩蔽的基数排序对整数排序要慢得多。我们这里讨论的是多少个整数?请在你的帖子中提一下。这让这变得非常不同这个问题的答案与为了对数字数据进行实际排序而尝试实现的答案非常不同。不,没有理由:如果需要使用位,就使用位逻辑:final int bit_ONE_MASK=0x1;…;如果(bit_ONE_MASK==(i&bit_ONE_MASK)){位1已设置}否则{不需要,做其他事情}
(当然,您不会对每个位掩码使用单独的声明,而是生成一个包含32个位掩码的数组,其中包含一个for循环和一个位移位)在测试时,从小处开始:不要生成“数字列表”,从一个很短的已知数字列表开始测试,这些数字尚未排序,如10,4
,然后在debug more中逐步完成程序:在任何一行,它是否以您期望的方式更新您的各种列表?酷。再添加一个数字,如10,100,4
,然后再重复一次:事情还在做什么你没想到它们会在每一行出现吗?不过,一个重要的提示是,bucket sort运行三个操作:。你的代码显示了分散和聚集步骤,但我没有看到在再次聚集bucket之前对bucket进行排序的任何代码。在任何代码之前:为什么?字符串转换,然后基数排序,以及相当缓慢的字符串提取,这听起来像是一个错误这比仅仅用快速排序或基于位掩蔽的基数排序对整数进行排序要慢得多。我们在这里讨论的是多少个整数?请在你的帖子中提及。这使得这是一个非常不同的问题,与你为了对数字d进行实际排序而尝试实现的问题相比,答案非常不同ata=)不,没有理由:如果需要使用位,则使用位逻辑:final int bit_ONE_MASK=0x1;…;如果(bit_ONE_MASK==(i&bit_ONE_MASK)){位一已设置}否则{不是,做其他事情}
(当然,您不会对每个位掩码使用单独的声明,而是生成一个包含32个位掩码的数组,其中包含一个for循环和一个位移位)在测试时,从小处开始:不要生成“数字列表”,从一个很短的尚未排序的已知数字列表开始测试,如10,4
,然后在debug more中逐步完成程序:在任何一行,它是否以您期望的方式更新各种列表?酷。再添加一个数字,如10,100,4
,然后逐步完成一个任务