Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用链表进行桶排序_Java_Bucket Sort - Fatal编程技术网

Java 使用链表进行桶排序

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排序,以便对整数数组进行排序。我正在尝试使用链表作为我的存储桶,但在理解如何使用链表时遇到了一些困难。谁能提供一个实现

我得到了这个算法,但对我来说没有多大意义:

你可以开始分析这个:

好吧,我不懂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的数组,然后将它们组合在一起,形成输出列表

以下是一个逐步的过程:

  • 设置一个初始为空的“bucket”数组
  • 分散:检查原始阵列,将每个对象放入其桶中
  • 对每个非空桶进行排序
  • 聚集:按顺序访问存储桶,并将所有元素放回原始数组
  • 这是提供给您的算法:

    这个简单的解释是:

  • A
    是必须排序的输入数组
  • n
    是输入数组的长度
    A
  • 必须将输入数组
    A
    的所有元素插入存储桶列表
    B
  • 现在,对桶列表中的每个桶进行排序
    B
  • 创建一个新的列表/数组以返回所有已排序的Bucket列表
  • 注意:根据您的实施情况,步骤4实际上可以像步骤3那样进行


    此算法不会深入到您必须编写的复杂细节中。这只是一个帮助您入门的简单指南。

    您需要某种方法来确定要排序的每个元素需要进入哪个存储桶-您可以创建一个界面,该界面为您提供一些常用方法,您可以调用这些方法:

    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]