我正在尝试进行基数排序,我看到的一些算法有一个桶数组,它应该将多个整数保存到桶数组的一个索引中,这里是我所指的算法:<登记/>
一个索引中是否真的可以有多个整数?怎么样?
或者是否有更简单的基数排序算法?
谢谢!
答案 0 :(得分:0)
是的,可以向数组添加多个int
,但您需要有一个数组,其中每个项目都是Object
而不是int
。
例如......
// 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>();
当然,如果你不总是在一个桶中有&lt; = 3项,你可以改变Bucket类使用一个数组或List
作为它的变量,而不是单独{{1} }第
你也可以使用多维数组......
int
但是,如果你开始使用不同大小的存储桶,它会变得有点混乱,你需要做更多的错误检查以确保...
// 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'
。如果出于这些原因,为什么我建议在多维数组上使用基于对象的数组。
答案 1 :(得分:0)
两种情况创建存储桶
第一种情况实际上只是第二种情况的退化情况。
请注意,根据您对数字排序的顺序,有几种基数排序变体。
太回答问题的数据结构部分 - 不,你不能也不会在每个索引上存储多个值。相反,每个桶通常表示为阵列的子序列。然后每个桶由其开始的偏移量表示(结束可以是隐含的)。
答案 2 :(得分:0)
bucket
本身就是int[]
(或List
或任何可以存储多个项目的内容)。
你不能把更多的东西放到1个索引中。
int[] array = new array[6];
int value = array[5];
如果有多个int,将不再有效。
最简单的可能是使用int[][]
数组。现在左侧框中的每个索引都指向一个完整的数组。这些数组的长度也可以不同:
答案 3 :(得分:0)
除了将桶表示为List或数组的可能性之外,还可以使用数组切片。在这种情况下,目标数组与输入数组的总大小相同。例如,桶0中有2个元素,桶1中有2个,桶2中有3个,桶3中有1个,桶5中有2个。
Bucket 0 : d[0], d[1]
Bucket 1 : d[2], d[3]
Bucket 2 : d[4], d[5], d[6]
Bucket 3 : d[7]
Bucket 5 : d[8], d[9]
这样做,排序必须跟踪每个桶的下一个索引。
答案 4 :(得分:0)
哇,数组和列表不是实现基数排序的方法。是列表工作,但它减慢了速度,当我这样做时,它比合并排序慢。最好的方法是将每个字节的频率数组实现为计数排序的一部分。我发布了我的代码here,仅用于并行排序。希望它有所帮助。