// the items to store in the array, which contain 3 ints
public class Bucket {
int number1 = -1;
int number2 = -1;
int number3 = -1;
public void addInt(int number){
if (number1 == -1){
number1 = number;
}
else if (number2 == -1){
number2 = number;
}
else if (number3 == -1){
number3 = number;
}
}
}
// the array, as used in other classes
Bucket[] bArray = new Bucket[6]; // 6 items in the array, where each item is a Bucket that contains 3 ints
// assigning ints into the array
bArray[2].addInt(56); // add the int '56' to the bucket at index '2' of the array
// You could also use other Array-like structures
ArrayList<Bucket> bList = new ArrayList<Bucket>();
// creating the buckets
int[][] buckets = new int[6][3];
// assigning ints into the array
bArray[2][0] = 56; // add the int '56' to the bucket at index '2' of the array, position '0'
5条答案
按热度按时间4bbkushb1#
bucket
本身就是int[]
(或List
或任何可以存储多个项目的东西)。你不能在一个索引中放入更多的东西。
如果有一个以上的int,就不再起作用。
最简单的可能是使用
int[][]
数组。现在左框中的每个索引都指向整个数组。这些数组也可以有不同的长度:Java Jagged Array
sq1bmfud2#
是的,可以将多个
int
添加到数组中,但需要有一个数组,其中每个项目都是Object
而不是int
。比如...
当然,如果你不总是在一个桶中有<=3个项目,你可以只改变Bucket类,使用数组或
List
作为它的变量,而不是单独的int
s。你也可以使用多维数组…
但是,如果您开始使用不同大小的桶,那么它会变得有点混乱,并且您需要进行更多的错误检查以确保……
1.当您尝试访问存储桶中的项目时,这些项目不是空的
1.当你向bucket中添加一个数字时,你需要检测第二维中下一个空的位置,这样你就不会覆盖已经在那里的
int
s。正是由于这些原因,我建议使用基于对象的数组而不是多维数组。
xnifntxz3#
两种情况创建存储桶
第一种情况实际上只是第二种情况的退化。
请注意,根据您对数字排序的顺序,有几种基数排序变体。
太回答数据结构部分的问题-不,你不能,也不会存储多个值在每个索引。相反,每个桶通常表示为阵列的子序列。然后,每个桶由其开始的偏移表示(结束可以是隐式的)。
kxeu7u2r4#
除了将存储桶表示为List或数组的可能性之外,还可以使用数组切片。在这种情况下,目标数组的总大小与输入数组相同。例如,bucket 0中有2个元素,bucket 1中有2个,bucket 2中有3个,bucket 3中有1个,bucket 5中有2个。
这样做,排序必须跟踪每个桶的下一个索引。
enxuqcxy5#
哇,数组和列表不是实现基数排序的方法。是的,列表工作,但它减慢了它,当我这样做时,它比合并排序慢。最好的方法是实现一个频率数组作为每个字节计数排序的一部分。我发布了我的代码here,只是参考并行排序。希望能帮上忙。