在java中实现Radix排序 - 很多问题

时间:2016-12-21 18:35:16

标签: arrays sorting recursion

虽然我的练习中没有明确说明,但我应该递归地实施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);
  }

1 个答案:

答案 0 :(得分:1)

  • 你没有在排序中使用数字,这是非常可疑的
  • 开关/案例看起来像是一种非常复杂的写i = array[j] / 100
  • 的方式
  • 我建议阅读维基百科对基数排序的描述。
  • 从基数10中提取数字的表达式为(number / Math.pow(10, digit)) % 10
  • 请注意,您可以从左到右或从右到左计算数字,确保您做到了这一点。
  • 我想你首先想要对数字0进行排序,然后对数字1进行排序,然后对数字2进行排序。因此,在排序结束时应该有一个递归调用来执行此操作。
  • 你的水桶阵列需要是二维的。你需要这样称呼它:buckets[i] = putInBucket(buckets[i], array[j])。如果在putInBuckets中处理null,则不需要初始化它。
  • 你需要一个2d桶阵列和putInBucket(而不是你的固定大小字段)的原因是你不知道每个桶中会有多少个数字
  • 在递归调用
  • 之前,缺少第二阶段(从存储桶向数组读回)
  • 确保在3位数之后停止递归
祝你好运