我对以下代码有三个问题:
static void funct(int[] list) {
final int N = 20;
java.util.ArrayList[] buckets = new java.util.ArrayList[N];
for(int i = 0; i< list.length; i++) {
int key = list[i];
if(buckets[key] = null)
buckets[key].add(list[i]);
}
int k = 0
for(int i = 0; i <buckets.length; i++) {
if(buckets[i] != null) {
for(int j = 0; j< buckets[i].size(); j++)
list[k++] = (Integer)buckets[i].get(j);
}
}
}
该算法存在一个主要缺点,它是否只能用于多达20个元素并且复杂度较低?
代码的重点是对元素列表进行排序 - 将它们放入数组中,然后放入存储桶中,然后再将它们从存储桶中放入数组中?
这是我难以理解的那个,你如何修改方法,以便你可以传递一个包含另一个类的对象而不是整数的数组?
答案 0 :(得分:2)
解决您的问题:
这有两个缺点。别担心片刻的复杂性;考虑它应该如何适用于20多个元素。对于存储桶排序,我们的想法是根据元素在元素总范围内的位置选择存储桶。在具有基于二进制的整数的计算机上执行此操作的最简单方法是选择数字中的前几位(最高有效位),并使用两个幂的桶数,例如16或32.您可以使用和操作(&
)获取最重要的位(因此找出存储桶)。然后,您可以使用这些位直接选择存储桶。
存储桶排序背后的想法是使用基数排序元素进行输入的初始传递,然后在小存储桶上使用不同的排序(或迭代的基数排序),这可能很小并且更容易排序,或者所有桶的连接(例如回到数组中)可能会以较低的复杂度进行排序。
存储桶排序基于知道输入的总范围,因此您可以将该范围划分为多个段,然后单独对输入进行分类。最简单的方法是输入数字。如果输入中的排序只是相对的,并且没有已知的绝对值,也没有简单的方法来确定任何一个元素在总范围内的位置,那么铲斗排序就不合适了。
答案 1 :(得分:0)
这是一个很好的家庭作业问题。许多问题都是主观的,几乎肯定取决于你的课堂作业。
我建议你自己做一下,因为上课会更好地了解导师所要求的内容,而不是任何答案。
此外,如果教室外有人看到这个,那么答案就是只使用内置数组排序并扔掉垃圾!