虽然在我的摘录中没有清楚地说明这一点,但我应该递归地实现基类。我已经为这个任务工作了好几天,但不幸的是,我只能制造垃圾。我们需要用两种方法工作。排序方法接收一个数字从0到999不等的数组和我们正在查看的数字。我们应该在这里生成一个二维矩阵,以便在数组中分配数字。因此,例如,523定位在第五行,27定位在第0行,因为它被解释为027。
我试图通过一个开关-用例构造来完成这个任务,将数组中的数字除以100,检查余数,然后将数字相对于余数进行定位。然后,我以某种方式试图构建只包含相同数字的数字的桶,例如,237和247将在第一轮中抛到同一个桶中。我尝试将“字段”-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);
}发布于 2016-12-21 22:53:43
i = array[j] / 100的方法。(number / Math.pow(10, digit)) % 10。buckets[i] = putInBucket(buckets[i], array[j])。如果在putInBuckets中处理null,则不需要初始化它。祝好运
https://stackoverflow.com/questions/41269657
复制相似问题