本次比较比较了
- 快速排序(基准为第一个元素)
- 快速排序 + 直接插入排序(基准为第一个元素)
- 快速排序(基准为随机元素)(没记下来,比基准为第一个要稳定)
- 快速排序(三数取中)
- Arrays.sort
比较方法
对一个有一百万个元素的数组进行排序,分别进行升序、降序、随机元素的比较。在排序10次后,获取平均时间。
结论
Arrays.sort:60
Arrays.sort:46
Arrays.sort:199
快排 + 插排 + 升序:378467
快排 + 插排 + 降序:282706
快排 + 插排 + 随机:142
快排(三数取中) + 插排 + 升序:140209
快排(三数取中) + 插排 + 降序:289103
快排(三数取中) + 插排 + 随机:137
快排(基准第一个) + 插排 + 升序:299692
快排(基准第一个) + 插排 + 降序:287440
快排(基准第一个) + 插排 + 随机:134
- 关于Arrays.sort 我查了下,用的是双轴快排:深入理解Arrays.sort()
- 这东西太快了,在leetcode的14.最长公共前缀中,比起两个嵌套for的暴力查询
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0 || "".equals(strs[0])) {
return "";
}
StringBuilder prefix = new StringBuilder();
int i = 0;
do {
++i;
prefix.append(strs[0], i - 1, i);
for (String str : strs) {
if (str.indexOf(prefix.toString()) != 0) {
return prefix.deleteCharAt(prefix.length() - 1).toString();
}
}
} while (i + 1 <= strs[0].length());
return prefix.toString();
}
}
使用Arrays.sort,时间复杂度不变,都是n^2,但是却快了太多
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length < 1) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
StringBuilder str = new StringBuilder();
Arrays.sort(strs);
String first = strs[0];
String endList = strs[strs.length - 1];
for (int i = 0; i < first.length(); i++) {
if (first.charAt(i) == endList.charAt(i)) {
str.append(first.charAt(i));
} else {
break;
}
}
return str.toString();
}
}
时间:第一个是使用了Arrays.sort的,第二个是没使用Arrays.sort的
提交时间 | 提交结果 | 执行用时 | 内存消耗 | 语言 |
---|---|---|---|---|
5 天前 | 通过 | 3 ms | 35.9 MB | Java |
6 天前 | 通过 | 14 ms | 40.2 MB | Java |