Java 使用链表进行桶排序
我试图在Java中实现bucket排序,以便对整数数组进行排序。我正在尝试使用链表作为我的存储桶,但在理解如何使用链表时遇到了一些困难。谁能提供一个实现 我得到了这个算法,但对我来说没有多大意义:Java 使用链表进行桶排序,java,bucket-sort,Java,Bucket Sort,我试图在Java中实现bucket排序,以便对整数数组进行排序。我正在尝试使用链表作为我的存储桶,但在理解如何使用链表时遇到了一些困难。谁能提供一个实现 我得到了这个算法,但对我来说没有多大意义: 你可以开始分析这个:好吧,我不懂java,但我仍然可以给你算法 最简单的方法是以数组的形式生成bucket,其中每个数组索引指向一个空链表 for each integer : integer goes to bucket i // bucket number depends on you
你可以开始分析这个:好吧,我不懂java,但我仍然可以给你算法 最简单的方法是以数组的形式生成bucket,其中每个数组索引指向一个空链表
for each integer :
integer goes to bucket i // bucket number depends on your implementation
pointer = bucket[i]
while pointer is not NULL
pointer = pointer->next
allocate new node
pointer points to this node
pointer.data = integer
pointer.next = NULL
由于您没有代码要分析,我将给出一个书面回答。创建一个Bucket类,该类将包含两个数字(0-9、10-19等)之间的范围,一个insert方法(按顺序插入),并包含一个空数组。然后创建一个存储桶列表,如下所示: 循环浏览输入列表,并将每个数字插入到存储桶列表中相应的存储桶中。当您插入值时,它将为您排序。最后,获取所有Bucket的数组,然后将它们组合在一起,形成输出列表 以下是一个逐步的过程:
A
是必须排序的输入数组n
是输入数组的长度A
A
的所有元素插入存储桶列表B
B
此算法不会深入到您必须编写的复杂细节中。这只是一个帮助您入门的简单指南。您需要某种方法来确定要排序的每个元素需要进入哪个存储桶-您可以创建一个界面,该界面为您提供一些常用方法,您可以调用这些方法:
public interface Indexable {
public int getIndex();
}
然后,您可以实现类似以下内容的桶排序算法:
public static <T extends Indexable> LinkedList<T> BucketSort( ArrayList<T> listToSort )
{
// work out how many buckets you need.
int max = 0;
for ( T listElement : listToSort )
max = Math.max( max, listElement.getIndex() );
// initialise the buckets.
ArrayList<LinkedList<T>> buckets = new ArrayList<LinkedList<T>>( max );
for ( int i = 0; i <= max; ++i )
buckets.add( new LinkedList<T>() );
// add items to the buckets.
for ( T listElement : listToSort )
buckets.get( listElement.getIndex() ).addLast( listElement );
// concatenate the buckets into a single list.
LinkedList<T> result = new LinkedList<T>();
for ( LinkedList<T> bucket : buckets )
result.addAll( bucket );
return result;
}
那么这个,
public static void main(String[] args) {
ArrayList<IndexableInteger> ints = new ArrayList<IndexableInteger>();
int[] values = { 45, 71, 16, 31, 0, 25, 6, 51, 40, 81 };
for ( int v : values )
ints.add( new IndexableInteger( v ) );
LinkedList<IndexableInteger> sorted = BucketSort( ints );
System.out.println( sorted );
}
注意:您可能不想使用
LinkedList
,因为它的addAll()
方法是以线性时间而不是固定时间运行的,但它很容易用于演示,这就是我在这里使用它的原因。如何确定要创建多少个存储桶。数组的最大值可以是任何给定的整数。例如,在一种情况下,我可能有一个[20,45,10,1]的数组。在这种情况下,我可能会创建五个bucket。但是,如果我有这个例子:[2000,1200,50]?在循环输入列表时创建该范围的Bucket。如果您看到2000,但它不存在一个Bucket,请创建一个2000-2009 Bucket。你不需要做所有0-1999的值…只是你需要的。确保你的水桶清单井然有序。此外,您可以随时选择制作您喜欢的产品系列(这是一个设计决策)。您可以将其设置为相对的,也可以对其进行硬编码。我会从硬编码开始(意味着总是做10的范围),因为它会使实现更简单。检查这个网站可能会有所帮助
public static void main(String[] args) {
ArrayList<IndexableInteger> ints = new ArrayList<IndexableInteger>();
int[] values = { 45, 71, 16, 31, 0, 25, 6, 51, 40, 81 };
for ( int v : values )
ints.add( new IndexableInteger( v ) );
LinkedList<IndexableInteger> sorted = BucketSort( ints );
System.out.println( sorted );
}
[0, 40, 71, 31, 51, 81, 45, 25, 16, 6]