我正在尝试使用存储桶排序算法对字符串进行排序。任务说运行时应该是大约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;
}
}
答案 0 :(得分:0)
您的代码可能很慢,因为它在Java中执行的操作非常低效:String
值是不可变的,因此连接每次都会创建一个全新的字符串。
您应该使用支持存储桶高效附加的数据类型。我想到的两个选项是StringBuilder
和LinkedList<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;
}
}