低效的铲斗排序?

时间:2015-11-09 01:54:29

标签: java bucket-sort

我正在尝试使用存储桶排序算法对字符串进行排序。任务说运行时应该是大约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;
      }
    }

2 个答案:

答案 0 :(得分:0)

您的代码可能很慢,因为它在Java中执行的操作非常低效:String值是不可变的,因此连接每次都会创建一个全新的字符串。

您应该使用支持存储桶高效附加的数据类型。我想到的两个选项是StringBuilderLinkedList<String>。 (当我每天上次使用Java时,后者本来会更好,可能仍然是。)

答案 1 :(得分:0)

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

一个好的经验法则:
每当您在循环中找到自连字符串时,最好使用StringBuilder
请参阅:When to use StringBuilder in Java

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

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;
    }
}