首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中实现基函数排序--有很多问题

在java中实现基函数排序--有很多问题
EN

Stack Overflow用户
提问于 2016-12-21 18:35:15
回答 1查看 356关注 0票数 0

虽然在我的摘录中没有清楚地说明这一点,但我应该递归地实现基类。我已经为这个任务工作了好几天,但不幸的是,我只能制造垃圾。我们需要用两种方法工作。排序方法接收一个数字从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的桶,在同一个桶中放入两个数字就意味着我们将覆盖第一个值。这可能是我们需要返回新的、扩展的桶的原因,但我不确定。另外,我不知道怎么走得更远。即使我现在有一个扩展的桶,我也不能简单地将它粘贴到旧的矩阵中,然后再将另一个元素复制到其中。

代码语言:javascript
复制
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);
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 22:53:43

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

祝好运

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41269657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档