一般来说,请记住以下几点:
如果您将数组拆分为由每个点的某个固定比率 a:b 定义的两部分,则在 O(log n) 拆分后,子数组的大小将减小到 0。
如果将数组拆分为两部分,其中一个大小是常数 k,则需要 Θ(n / k) 拆分才能使子数组大小降至 0。
现在,考虑快速排序在递归的每个级别所做的工作。在每一层,它需要做与层中元素数量成正比的工作。如果您使用第一种方法并且有类似 1/20 : 19/20 的分割,那么每层最多有 n 个元素,但只有 O(log n) 层,所以完成的总工作将是 O(n log n),这很棒。
另一方面,假设您总是完成五个元素。然后每个步骤的较大数组的大小为 n, n - 5, n - 10, n - 15, ..., 10, 5, 0。 (n 2 ) 总工作量,效率不高。
一般来说,在快速排序中尽量避免一次拆分固定数量的元素。这给了您需要担心的退化情况。