使用快速排序获取数组中的k个最小元素

时间:2014-07-03 14:00:17

标签: algorithm time-complexity quicksort

如何使用quicksort(除了排序和获取 k 最小元素之外)从未排序数组中找到 k 最小元素?最糟糕的情况下运行时间是否相同O(n ^ 2)?

1 个答案:

答案 0 :(得分:1)

你可以优化快速排序,你所要做的就是不要在阵列的其他部分运行递归药水,而不是"第一个"一半,直到您的分区位于k位置。如果您不需要对输出进行排序,则可以在此处停止。

警告:未来的非严格分析。

但是,我认为最坏情况下的时间复杂度仍为O(n ^ 2)。当你总是选择最大或最小的元素作为你的支点,并且你进入冒泡排序(即你不能选择一个分裂和征服的支点)时,就会发生这种情况。

另一种解决方案(如果此集合的唯一目的是选择 k min元素)是使用有限树高ciel(log(k))的最小堆(或者恰好是k个节点) 。所以现在,对于每个插入最小堆的插入,插入的最大时间为O(n*log(k)),并且对于完全堆中的两者而言,删除的时间相同(相对于O(n*log(n))。这将以线性时间最坏情况的顺序返回数组。与mergesort相同。