Java 低效桶式分拣?

Java 低效桶式分拣?,java,bucket-sort,Java,Bucket Sort,我正在尝试使用bucket排序算法对字符串进行排序。任务说运行时间应该在0.05秒左右,但我的运行时间超过了9秒。为什么我的要花这么长时间,我怎样才能让它更快。文件中大约有90000个名字。我是否正确地进行桶排序 public static void bucketSortByLength() { String[] bucket = new String[14]; String[] insideBucket; int index = 0; for(i

我正在尝试使用bucket排序算法对字符串进行排序。任务说运行时间应该在0.05秒左右,但我的运行时间超过了9秒。为什么我的要花这么长时间,我怎样才能让它更快。文件中大约有90000个名字。我是否正确地进行桶排序

public static void bucketSortByLength() {
      String[] bucket = new String[14];
      String[] insideBucket;
      int index = 0;
      for(int i = 0; i <= 13; i++)
        bucket[i] = "";
      for(int i = 0; i < numNames; i++)
        bucket[names[i].length()] += names[i] + " ";
      for(int i = 0; i <= 13; i++){
        insideBucket = bucket[i].split("\\s+");
        for(String s : insideBucket)
          names[index++] = s;
      }
    }
公共静态无效bucketSortByLength(){
字符串[]桶=新字符串[14];
字符串[]在包内;
int指数=0;

对于(int i=0;i您的代码可能很慢,因为它在Java中执行的某些操作可能非常低效:
String
值是不可变的,因此每次串联都会创建一个全新的字符串


您应该使用支持有效附加的数据类型作为存储桶。我想到的两个选项是
StringBuilder
LinkedList
(当我上次每天使用Java时,后者会更好,现在可能仍然是。)

正如其他人所说,由于字符串连接,这是低效的

好的经验法则:
每当您在循环中发现自连接字符串时,最好使用
StringBuilder

见:

此代码应提供您期望的性能:

public static void bucketSortByLength() {
    StringBuilder[] bucket = new StringBuilder[14];
    int index = 0;
    for(int i = 0; i <= 13; i++)
        bucket[i] = new StringBuilder();
    for(int i = 0; i < numNames; i++)
        bucket[names[i].length()].append(names[i]).append(' ');

    for(int i = 0; i <= 13; i++){
        String[] insideBucket = bucket[i].toString().split("\\s+");
        for(String s : insideBucket)
            names[index++] = s;
    }
}
公共静态无效bucketSortByLength(){
StringBuilder[]bucket=新StringBuilder[14];
int指数=0;

对于(int i=0;i重复串联会降低性能。使用
StringBuilder
。此外,根据任务的不同,所需的结果可能不是14个串联字符串,而是一个
String[][]
(或者更好,
ArrayList
)。在这种情况下,我不能使用StringBuilder(对我可以/不能使用的内容的限制),但这是一个很好的建议。考虑到每个bucket只存储一组字符串,而bucket id只是它的索引,我不明白如何实现字符串[][],您能详细说明一下吗?您的bucket是一个字符串(
“abc”
),而不是一组字符串。使用
字符串[]
,它实际上可能是一组字符串(
{“a”、“B”、“C”}
)。除非您对“排序”的定义与我的不同,否则此代码似乎不会对字符串进行排序。您是否应该只按长度排序,而不考虑将它们按字母顺序(按字典顺序)排序顺序?如果是这样,请编辑您的问题并澄清。如果您应该将字符串按顺序排列,那么您的方法是完全错误的。此外,如果对您可以或不能使用的内容有任何限制,请在问题中指定这些限制。成功了!完成了0.04!谢谢大家!