基数排序分解

时间:2014-08-14 01:23:00

标签: java algorithm sorting radix-sort

这是一个简单的问题,我试图找出基数排序,我得到了这个代码,但是不能解决为什么我们需要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];
    }
}

1 个答案:

答案 0 :(得分:0)

  

但是不能解决为什么我们需要W,似乎它使用了它   对于给出的单词的长度但是,我想知道是否有这些单词   什么不固定?

如果字符串较长,则其余字符将不参与排序。如果字符串较短,那么我相信您会获得IndexOutOfBoundException

  

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

正如Blorgbeard所说,这指的是&#34;扩展&#34; ASCII集。 ASCII未定义传递127.&#34;扩展&#34; ASCII包括0到255之间的字符。

  

为什么我们需要计算频率计数并计算累积量?

这是对d个字符的字符串进行排序。实际上,前三个部分执行排序,最后一个部分复制部分排序的数组。

  

我们技术上不需要那两个for循环吗?

从技术上讲,你可以找到另一种方法来对d字符上的字符串进行排序,但这似乎可以很好地完成这项工作。