我一直不明白,第 k 大的数的正解为什么时间复杂度是 O(n)。看快排代码,二分递归代码一眼就是 O(nlog n),一看题解,全都说证明在算法导论,自己看书。 我看不懂书,因此想尝试做一个 benchmark,通过数据规模增长和 benchmark 用时来判断其时间复杂度。
- 生成足够数量的随机数。后续所有测试都在这样同一个相对随机的数据上进行。
- find_kth_largest 函数为 leetcode 题解(基于快速排序的选择方法) 改写为 rust 版本的结果。
注:find_kth_largest 函数本身没有 clone;我在 benchmark 之前就进行了数据 clone。
测试结果为(已排序,否则 cargo test 输出的排序为 10 100 1000 10000 50 500 5000):