快速排序时间比较

本次比较比较了

  • 快速排序(基准为第一个元素)
  • 快速排序 + 直接插入排序(基准为第一个元素)
  • 快速排序(基准为随机元素)(没记下来,比基准为第一个要稳定)
  • 快速排序(三数取中)
  • 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 ms35.9 MBJava
6 天前通过14 ms40.2 MBJava
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值