Java 基数排序分解

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

这是一个简单的问题,我试图找出基数排序,我得到了这段代码,但我无法退出,因为我想知道为什么我们需要W,它似乎用它来表示给定单词的长度,但是,我想知道这些单词是否不固定,然后呢

为什么我们需要扩展ascii大小

为什么我们需要计算频率计数和累积数

从技术上讲,我们不需要这两个for循环,对吗

谢谢

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。这本可以很容易避免的