虽然我的练习中没有明确说明,但我应该递归地实施Radix sort。我已经在这项任务上工作了好几天,但不幸的是,我只是设法生产了垃圾。我们需要使用两种方法。 sort方法接收一个数字范围从0到999的数字,以及我们正在查看的数字。我们应该在这里生成一个二维矩阵,以便在数组内部分配数字。因此,例如,523位于第五行,27位于第0行,因为它被解释为027.
我尝试在switch-case-construct的帮助下完成此操作,将数组内的数字除以100,检查余数,然后根据余数定位数字。然后,我以某种方式尝试构建仅包含具有相同数字的数字的桶,因此例如,237和247将在第一个" round"中的同一桶中抛出。我尝试通过获取"字段" -matrix的整行来实现这一点。我们在之前放入了值。
在putInBucket方法中,我需要扩展桶(我设法做对了,我猜)然后返回它。
我很抱歉,我知道代码完全是垃圾,但也许那里的某些人了解我的目标,并且可以帮助我一点点。
我根本不知道如何在这里使用水桶,我甚至不明白我为什么要对它们进行检测,而且我也没有看到任何方法将它归还排序方法(我认为,我需要这样做)。
进一步说明:
整个过程意味着按如下方式工作:我们采用一个整数范围从0到999的数组。然后每个数字按其第一个数字排序,如上所述。想象一下,你有桶的数字从0到9表示。你可以通过将523放入桶5中,将672放入桶6中来开始排序,依此类推。当其中一个桶中只有一个数字(或根本没有数字)时,这很容易。但是当你想在一个存储桶中放入多个数字时,它会变得越来越难(而且递归可能会在哪里)。现在的机制如下:我们在一个桶中放入两个具有相同第一个数字的数字,例如237和245.现在,我们想要通过相同的算法再次对这些数字进行排序,这意味着我们称之为排序方法(不知何故)再次使用一个只包含这两个数字并再次排序的数组,但现在我们通过查看第二个数字来做,所以我们将比较3和4.我们对数组中的每个数字进行排序,最后,为了获得一个排序的数组,我们从最后开始,意思是在第9桶,然后将所有内容放在一起。如果我们在第2桶,算法将查看递归步骤并已经接收已排序的数组[237,245]并将其传递以完成整个事情。
我自己的问题:
我不明白为什么我们需要扩展一个桶,我无法从描述中弄清楚。简单地说,我们应该这样做。我想我们会在其中复制另一个元素,因为如果我们有从0到9的桶,在同一个桶中放入两个数字只意味着我们会覆盖第一个值。这可能是我们需要返回新的扩展存储桶的原因,但我不确定。另外,我不知道如何从那里走得更远。即使我现在有一个扩展的存储桶,但我不能简单地将其粘贴到旧矩阵并再次将另一个元素复制到其中。
public static int[] sort(int[] array, int digit) {
if (array.length == 0)
return array;
int[][] fields = new int[10][array.length];
int[] bucket = new int[array.length];
int i = 0;
for (int j = 0; j < array.length; j++) {
switch (array[j] / 100) {
case 0: i = 0; break;
case 1: i = 1; break;
...
}
fields[i][j] = array[j]
bucket[i] = fields[i][j];
}
return bucket;
}
private static int[] putInBucket(int [] bucket, int number) {
int[] bucket_new = int[bucket.length+1];
for (int i = 1; i < bucket_new.length; i++) {
bucket_new[i] = bucket[i-1];
}
return bucket_new;
}
public static void main (String [] argv) {
int[] array = readInts("Please type in the numbers: ");
int digit = 0;
int[] bucket = sort(array, digit);
}
答案 0 :(得分:1)
i = array[j] / 100
(number / Math.pow(10, digit)) % 10
。buckets[i] = putInBucket(buckets[i], array[j])
。如果在putInBuckets中处理null,则不需要初始化它。