Java 基数排序分解
这是一个简单的问题,我试图找出基数排序,我得到了这段代码,但我无法退出,因为我想知道为什么我们需要W,它似乎用它来表示给定单词的长度,但是,我想知道这些单词是否不固定,然后呢 为什么我们需要扩展ascii大小 为什么我们需要计算频率计数和累积数 从技术上讲,我们不需要这两个for循环,对吗 谢谢Java 基数排序分解,java,algorithm,sorting,radix-sort,Java,Algorithm,Sorting,Radix Sort,这是一个简单的问题,我试图找出基数排序,我得到了这段代码,但我无法退出,因为我想知道为什么我们需要W,它似乎用它来表示给定单词的长度,但是,我想知道这些单词是否不固定,然后呢 为什么我们需要扩展ascii大小 为什么我们需要计算频率计数和累积数 从技术上讲,我们不需要这两个for循环,对吗 谢谢 public static void sort(String[] a, int W) { int N = a.length; int R = 256; // extend ASCI
public static void sort(String[] a, int W)
{
int N = a.length;
int R = 256; // extend ASCII alphabet size
String[] aux = new String[N];
for (int d = W-1; d >= 0; d--) {
// sort by key-indexed counting on dth character
// compute frequency counts
int[] count = new int[R+1];
for (int i = 0; i < N; i++)
count[a[i].charAt(d) + 1]++;
// compute cumulates
for (int r = 0; r < R; r++)
count[r+1] += count[r];
// move data
for (int i = 0; i < N; i++)
aux[count[a[i].charAt(d)]++] = a[i];
// copy back
for (int i = 0; i < N; i++)
a[i] = aux[i];
}
}
但是我不明白为什么我们需要W,它似乎就是这么用的
对于给出的单词长度,我想知道
没有修好那又怎样
如果字符串较长,则剩余字符将不参与排序。如果字符串较短,那么我相信您将得到IndexOutOfBoundException
为什么我们需要扩展ascii大小
正如Blorgbeard所提到的,这是指扩展的ASCII集。未定义ASCII。扩展ASCII包含从0到255的字符
为什么我们需要计算频率计数和累积数
这是对dth字符上的字符串进行排序。实际上,前三部分执行排序,最后一部分复制回部分排序的数组
从技术上讲,我们不需要这两个for循环,对吗
从技术上讲,您可以找到另一种方法对dth字符上的字符串进行排序,但这似乎做得很好。//extend ASCII alphabet size的意思是256是扩展的ASCII alphabet size,而不是代码扩展了ASCII alphabet size。那么,为什么要创建一个大小为257的数组呢,我不懂ascii,我认为这是我的问题是的,我认为作者只是过于热衷于防止超出范围的错误。计数[256]从未被访问过。@Blorgbeard是的,这就是我所想的,但是那些看起来像是循环的开始呢unnecessary@Blorgbeard是的。a[i]。字符+1可以是256。作者对使用计数[0]的累积部分使用+1。这本可以很容易避免的