【问题标题】:Radix Sort Java基数排序 Java
【发布时间】:2009-11-15 06:38:52
【问题描述】:

欢迎。我有一个基数排序方法,它使用一个数组来遍历,但必须有另一个数组(bin)将存储在一个空队列中。我对如何为垃圾箱排长队感到困惑。我还有一个 findPlace 方法,可以在调用时找到每个数字的位置。所以,这就是我得到的。有人可以帮我找到我缺少的东西吗?非常感谢您的宝贵时间。

public static void radix(int [] list){
       int [] bin = new int[10]; 
      ArrayQueue<Integer> part = new ArrayQueue<Integer>(); // EDIT What would I do with this queue?? 
      int num = 0; 
         for(int i=0;i<list.length;i++)
         {
            bin[i] = 0;  
          }

            for(int pass=0;pass<list.length;pass++)
           {
                for(int num=0;num<list.length;num++)
               {
                       int digit=findPlace(bin[pass], num);
                 }

                  bin[digit].add(list[num]); // add to the bin
            }
              // Put back into list
               for(int h=0; h<10; h++)
               {
                    while(!bin[h].isEmpty())
                    {
                       list[num] = bin[queueNum].remove();
                     num++;
                    }
              }
        }


public static int getPlace (int x, int place)
    {return x/place % 10;}

我还做了一个方法来找到存储桶,所以我只需要知道如何将它放入数组中,我会这样做吗? part.add(getPlace(x, place));?

【问题讨论】:

    标签: java radix-sort


    【解决方案1】:

    您的数组bin 不像队列那样只是因为您希望它:) 数组没有像add()remove() 这样的方法。对于如何解决此问题,您有两种选择:

    • 自己编写正确处理队列的程序:队列由一个数组和两个指向该数组的指针组成,传统上称为headtail。您必须编写自己的方法来添加和删除,这将与数组和指针一起使用,并处理空队列或溢出队列。

    • 使用 Java 的内置 Queue 类。它记录在库的 Javadocs 中。不过,不知道您的任务是否打算让您建立自己的队列。

    更新另一个细节:

    您询问了如何从数字中提取单个数字。正如维基百科文章中所建议的,从最低有效数字 (LSD) 开始工作是最简单的。为此:

    • 要提取最后一个数字,请执行digit = number % 10(这是模运算)。您将得到一个介于 0 和 9 之间的整数。
    • 要去掉最后一个数字,只需除以 10。然后你可以去掉另一个数字。
    • 由于您需要多次查看数字的倒数第 n 位,因此最好将此功能放入单独的方法中。

    您可以使用 0 到 9 来选择正确的队列来放置您的号码。

    将所有号码排入 10 个存储桶后,您需要将它们从那里复制回一个列表。然后重复,只要您尚未处理的任何数字中仍有数字。

    【讨论】:

    • 是的,您必须在排序方法中初始化队列;在那里创建队列可能也是一个好主意。至于你的算法,它看起来是错误的,但我还不够聪明,无法说出它应该是什么样子。
    • 好吧,我阅读了 Wikipedia 条目并在那里找到了有关如何使用队列进行基数排序的部分 en.wikipedia.org/wiki/Radix_sort#Iterative_version_using_queues> 。据此,您不需要 1 个而是 10 个队列。您是否阅读了说明(或获得了其他说明)并弄清楚您需要做什么?
    • 是的,但我不想为你做作业。无论您使用什么队列,都可以创建一个包含 10 个队列的数组。另外,请参阅上面的答案更新。
    • 你之前说的这个 Array 队列类在哪里?一个体面的队列实现将具有您可以使用的 add() 和 remove() 等方法。
    • 我要去睡觉了。提出另一个问题,说您需要有人通过实施基数排序来完成家庭作业,而您的编程和解决问题的能力非常弱的额外挑战。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2019-05-07
    相关资源
    最近更新 更多