使用quicksort =>查找数组中的第k个最小项预计运行时间?

时间:2013-07-29 01:35:20

标签: sorting quicksort

如果我使用quicksort的修改版本来查找数组中的第k个最小项,为什么预期的运行时间为O(n)(如Programming Pearls所述)?

我正在使用的算法执行以下操作:

1) Runs quick sort on the array
2) If k is > the correct location of pivot, then run quicksort on the 2nd half.
Otherwise run it on the first half.

我认为这需要O(n * logn)工作。

2 个答案:

答案 0 :(得分:4)

此链接可能有助于理解随机快速选择的证明http://pine.cs.yale.edu/pinewiki/QuickSelect

获取Kth顺序统计数据背后的想法是,选择一个数据透视表,并按照快速排序的建议对数据进行分区,并找出要搜索的元素所在的分区。分区具有O(n)的复杂性< / strong>即可。分区后,您需要选择一个结果分区进行进一步处理,而不像快速排序,您必须处理这两个分区。

在下面的描述中,我并不想证明,而是想直观地思考理解预期的复杂性,

为简单起见,让我们假设,在每次迭代中,pivot将数组分成相等的一半,那么复杂性显然是O(n),如

   n + (n/2) + (n/4) ... <= c.n, O(n)

为了直观理解,获得最坏情况分区,在每次迭代中必须处理(n-1)个元素,只有(1 / n)的概率发生。所以,无论如何最坏的情况是O(n ^ 2)。

无论如何,如果您需要严格的预期复杂性证明,您可以查看提供的链接。

答案 1 :(得分:0)

这不是本书中描述的算法。更有可能在(1),(2)等处执行一个分区