对 6 位非负数数组进行基数排序

Posted

技术标签:

【中文标题】对 6 位非负数数组进行基数排序【英文标题】:radix sort on array of 6 digit non-negative numbers 【发布时间】:2012-11-19 00:31:26 【问题描述】:

我不知道如何从队列数组中删除值并使用基数排序将它们放入整数数组中。

这是我现在的代码:

 public static void radixSort(int[] a) 
  //Create an array of 10 empty array queues
  Queue[] arr =  new Queue[a.length];

  for (int i = 0; i < arr.length; i++)
      arr[i] = new ArrayQueue();

  for (int place = 1; place <= 100000; place *= 10) 
      for (int i = 0; i < a.length; i++)
          arr[i].add(selectDigit(a[i],place));
      for (int j = 0; j < arr.length; j++)
         a[j] = (Integer) arr[j].iterator().next();     
   
 

place 是一个应该为 (1,10,100,1000,100000) 的 int,它指的是 6 位数字中的位置,例如 place = 1 in 684720 从 selectDigit 返回的数字将为 0(1s place) 等 selectDigit 采用参数 (int digit, int place)。现在我有一个空数组 arr,其中每个索引都包含一个空数组队列。对于数组中的每个数字 a,我将正确的 1s、10s、100s 等值添加到 arr[i] 的正确索引中。在这部分中,我不确定是否应该将队列中的每个值移回数组中,但我不确定如何实现。

编辑:上面的修改后的代码产生了以下输出(仍然不正确),它基本上在 a 的每个索引中都有最后一位(排序前),但不是 10s、100s、1000s 等位置。

Array before sort: 602408, 183305, 695804, 934237, 285465, 860846, 196873, 139853, 444089, 594823, 436004, 812525, 302271, 104933, 811084, 350006, 115421, 582466, 192803, 163908, 380316, 734056, 595086, 314881, 784318, 959734, 834553, 982188, 272574, 98232
Array after  sort: 8, 5, 4, 7, 5, 6, 3, 3, 9, 3, 4, 5, 1, 3, 4, 6, 1, 6, 3, 8, 6, 6, 6, 1, 8, 4, 3, 8, 4, 2

【问题讨论】:

这听起来像是过度设计(waaaay 太复杂了)。你实际上想要达到什么目的?即英文,暂时忘记了实现。 取一个六位数的数组,从低到高排序。 现在我在 arr[i].add(selectDigit(a[i], place));可能是因为我没有正确初始化 arr[] 。如何正确初始化? 澄清一下,您要求基数排序是因为这是一个由 6 位整数组成的大型数组,对吧? 是的,没错。数组中的每个索引都包含一个 6 位数字。 【参考方案1】:

不要重新发明***。你的方法应该被删除,你应该只调用它:

Arrays.sort(a);

【讨论】:

以上是关于对 6 位非负数数组进行基数排序的主要内容,如果未能解决你的问题,请参考以下文章

基数排序

数据结构——基数排序

让基数/计数排序与负数一起工作

如何使用基数排序对变长字符串数组进行排序?

使用队列对数组排列,基数排序

PHP 基数排序(计数排序实现)