java 中的radix,关于java:实现Radix递归排序-如何在最后打印元素?

注意:

之前我已经在该程序上提出了一个具体问题,但是现在我停留在最后一步,我想为此打开一个新线程可能会更好。

描述:

我需要实现一个程序,该程序以递归方式对范围从0到99999的数字进行排序(这基本上是Radix排序)。该过程本身就是一个简单的例子:用户在main方法中键入一个包含这些数字的数组。然后,main方法调用排序方法,在此方法中,我创建了一个名为'space'的二维数组,该数组包含10行和1列。然后,我将数组中的每个数字除以数字,第一次运行将为10.000。因此,例如23456/10000 = 2,3456 = 2(在Java中),因此,程序会将这个数字放在space [2] [0]中,因此放在第二行中。然后,我们将整个行都进行扩展,这是通过putInBucket方法完成的。我们这样做是为了确保可以在同一行中放入另一个数字。

我们对"数字"数组中的每个数字执行此操作。然后,我们要使用这些行并按照相同的原理再次对其进行排序,但是现在我们来看第二个数字。我们要从左到右,而不是从右到左。所以,如果我们的第二行看起来像这样

[23456,24567],

我们想要比较3和4。为此,我们在每个递归调用中计算位数/ 10。如果数字为0,则不再排序。

递归调用本身适用于0到9的行,在此之前我们输入了不同的数字,现在通过将它们放在不同的行中再次对它们进行排序。

题:

我认为程序可以完成它应该做的事情。不幸的是,我不知道如何正确打印结果。例如,在下面的代码中,我尝试在main方法中打印出存储区,但它只能为我提供刚键入的数组,因此可能不正确。

我需要从第9行中的所有元素开始,如果这一行包含多个数字,则必须按照在递归调用中得到的结果对它们进行排序。

有谁知道如何正确实现这一点?提前致谢!

public static int[] sort(int[] numbers, int digit) {

if (numbers.length <= 1 || digits == 0)

return numbers;

int[][]space = new int[10][1];

int i, j = 0;

for (j = 0; j < numbers.length; j++) {

i = numbers[j] / digit % 10;

space[i][0] = numbers[j];

space[i] = putInBucket(space[i], numbers[j]);

}

digit = digit / 10;

for (i = 0; i < 9; i++) {

sort(space[i], digit);

}

return numbers

}

private static int[] putInBucket(int[] bucket, int number) {

int[] bucket_new = 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[] numbers = IO.readInts("Numbers:");

int digit = 10000;

int[] bucket = sort(numbers, digit);

for (int i = 0; i < bucket.length; i++) {

System.out.println(bucket[i]);

}

在某种程度上,空间的本地实例正在更新,但是它返回的输入参数编号尚未更新。

我认为空间应该初始化为space [10] [0],因为可能再有一行空间将没有任何数据。

您确定这应该是从右到左(最低有效数字在前)的基数排序吗?通常,这是通过迭代完成的(只需在每个外部循环上将空间复制回数字)。基数从左到右排序(最高有效数字在前)通常是使用递归进行的。

Bijay Gurung的sort()可以稍微简化。评论中指出的更改:

public static int[] sort(int[] numbers, int digit) {

if (numbers.length == 0 || digit <= 0)

return numbers;

int[][]space = new int[10][0];  // [1] => [0]

int[] len = new int[10];

int i, j;

for (j = 0; j < numbers.length; j++) {

i = (numbers[j] / digit) % 10;

len[i]++;

space[i] = putInBucket(space[i], numbers[j]);

}

for (i = 0; i < 10; i++) {

//  int[] bucket = new int[len[i]];        // deleted

//  for (int k = 0; k < len[i]; k++)       // deleted

//      bucket[k] = space[i][k];           // deleted

space[i] = sort(space[i], digit / 10); // bucket => space[i]

}

int k = 0;

for (i = 0; i < 10; i++) {

for (j = 0; j < len[i]; j++) {

numbers[k] = space[i][j];

k++;

}

}

return numbers;

}

sort不能是一个无效的方法,这是他们希望我们这样做的方法。

另外,将空间初始化为space [10] [0]给我一个ArrayOutOfBoundsException。

@Julian-putinbucket需要修复。 将bucket复制到bucket.new(可能为零元素),然后将数字附加到bucket_new。 如果从左到右,则第一级应使用digit / 10000,下一级(digit / 1000)%10,依此类推。

像比盖实施了吗?

非常感谢你! 我很感激。 :-)

正如我在回答上一个问题时所展示的那样,您需要返回排序后的numbers。您可以通过从最小到最大的数字通过space来获得排序的数字。

int k = 0;

for (i = 0; i < 10; i++) {

for (j = 0; j < len[i]; j++) {

numbers[k] = space[i][j];

k++;

}

}

为此,您可能需要跟踪每个数字的存储桶的长度(len[i]变量)。

完整的解决方案是:

public static int[] sort(int[] numbers, int digit) {

if (numbers.length == 0 || digit <= 0)

return numbers;

int[][]space = new int[10][1];

int[] len = new int[10];

int i, j = 0;

for (j = 0; j < numbers.length; j++) {

i = (numbers[j] / digit) % 10;

len[i]++;

space[i] = putInBucket(space[i], numbers[j]);

}

for (i = 0; i < 10; i++) {

int[] bucket = new int[len[i]];

for (int k = 0; k < len[i]; k++)

bucket[k] = space[i][k];

space[i] = sort(bucket, digit / 10);

}

int k = 0;

for (i = 0; i < 10; i++) {

for (j = 0; j < len[i]; j++) {

numbers[k] = space[i][j];

k++;

}

}

return numbers;

}

private static int[] putInBucket(int[] bucket, int number) {

int[] bucket_new = new int[bucket.length+1];

for (int i = 1; i < bucket_new.length; i++) {

bucket_new[i] = bucket[i-1];

}

bucket_new[0] = number;

return bucket_new;

}

非常感谢您的努力! :-)

对我来说也很富有成果。 我是在(错误的)假设下认为多维数组的行是固定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值