【问题标题】:2D bucket sort issue二维桶排序问题
【发布时间】:2015-11-25 17:21:01
【问题描述】:

请不要让这篇文章的长度吓到你!好的,这是我目前正在处理的提示:


“编写一个名为 BucketSort 的类,其中包含一个名为 sort 的方法:

a) 根据值的“一”(最右边)数字,将一维数组的每个值放入桶数组的一行中。例如,97 放置在第 7 行,3 放置在第 3 行,100 放置在第 0 行。此过程称为分发通道。

b) 逐行遍历存储桶数组,并将值复制回原始数组。此过程称为收集通行证。一维数组中前面的值的新顺序是100、3和97。

c) 对每个后续的数字位置(十、百、千等)重复此过程。在第二次(十位)通过时,100 放在第 0 行,3 放在第 0 行(因为 3 没有十位)和 97 放置在第 9 行。收集通过后,一维数组中的值的顺序为 100、3 和 97。在第三(百位)通过时,100 放置在第 1 行, 3 放置在第 0 行,97 放置在第 0 行(在 3 之后) 在最后一次收集过程之后,原始数组按排序顺序排列。被排序。

这种排序技术提供了比冒泡排序更好的性能,但需要更多的内存——冒泡排序只需要一个额外的数据元素的空间。此比较是空间/时间权衡的一个示例:桶排序比冒泡排序使用更多内存,但性能更好。此版本的桶排序需要在每次遍历时将所有数据复制回原始数组。另一种可能性是创建第二个二维桶数组并在两个桶数组之间反复交换数据。桶的二维数组是整数数组长度的10倍"


我知道有点吃饱了。下面是我到目前为止的代码,但我不知道为什么它不能以正确的顺序打印,我认为是时候重新审视一下了。任何想法表示赞赏,谢谢!

import java.util.Arrays;

public class BucketSort_main {

public static void main(String[] args) 
{  
    int[] numbers = new int [5]; 
    int[] tnumbers = new int [500]; 
    int [][] bucket = new int [10][numbers.length]; 
    int [] a = new int [10]; 
    int count = 0;
    int divisor = 1; 
    int cnt = 1; 
    boolean moreDigits = true; 




    for (int s = 0; s < 10; s++)
        {
            a[s] = 0; 
        }

    for (int b = 0; b < numbers.length; b++) 
    { 
        numbers [b] = (int)(Math.random()*2000); 
        tnumbers [b] = numbers [b]; 
    } 

    int[] tmpSort = new int[10]; 


    while (moreDigits)         
    { 
          moreDigits = false; 
          for (int i = 0; i < tmpSort.length; i++) 
          { 
              tmpSort[i]= -1;  // hint hint 
          } 
          for (int i = 0; i < numbers.length; i++) 
          { 
            int tmp = tnumbers[i] / divisor; 

            if (tmp/10 != 0)
                {
                    moreDigits = true; 
                }

            int digit = tmp % 10; 

            tmpSort[digit] = tnumbers[i];  // hint hint 

            System.out.println("Number["+i+"], Digit "+cnt+" is "+digit + ". Full number = " + tnumbers[i]); 

            bucket [digit][a[digit]] = tnumbers[i]; 

            System.out.println ("Digit " + digit + " going to slot " + a[digit] + ". " + bucket[digit][a[digit]]); 
            System.out.println (" "); 

            a[digit]++; 

        }     
        cnt++; 
        divisor *= 10; 

        for (int x = 0; x < 10; x++) 
        { 
            a [x] = 0; 
            for (int y = 0; y < numbers.length; y++) 
            { 
                if (bucket[x][y] != 0) 
                { 
                    tnumbers [y] = 0; 
                    tnumbers [y] = bucket[x][y]; 
                    bucket[x][y] = 0; 
                }                     
            }  
        }  
     }     

            for (int o = 0; o < numbers.length; o++) 
            { 
                System.out.println (tnumbers[o]); 
            }

        } 
 }

【问题讨论】:

    标签: java bucket-sort


    【解决方案1】:

    问题就在这里:

    for (int x = 0; x < 10; x++) 
            { 
                a [x] = 0; 
                for (int y = 0; y < numbers.length; y++) 
                { 
                    if (bucket[x][y] != 0) 
                    { 
                        tnumbers [y] = 0; 
                        tnumbers [y] = bucket[x][y]; 
                        bucket[x][y] = 0; 
                    }                     
                }  
            }  
    

    您正在使用相同的y 从存储桶中获取值并将值分配给tnumbers。因此,当您第二次循环访问 y 时,您将在 tnumbers[0]tnumbers[1] 等处重新开始......

    修复此问题,您的代码将正常运行。

    【讨论】:

    • 感谢您的回复,但我很困惑,如何在不破坏整个过程的情况下更改 'tnumbers[y] = bucket[x][y]' 行中存储桶的 y 值?
    • 最简单的方法是编写一个辅助迭代器,专门处理该部分中的tnumbers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多