提问者:小点点

无法理解快速选择算法


我有一个问题,理解快速选择算法。我知道它是基于快速排序算法(我很熟悉),它给出了所需的结果,可能会留下数组的一部分未排序。问题是从数组中找出第二个最小的元素,即:

int a[4] = {1,3,5,2} ;

现在假设我们随机选择pivot,那么根据这篇文章,我们有以下条件:

> 。那么你已经找到了第k个最小的。这是因为分区的工作方式。正好有k-1个元素小于第k个元素。

<代码(&L);pivot/code>。则第k个最小值位于枢轴的左侧。

);pivot/code>。则第k个最小值位于枢轴的右侧。要找到它,你必须找到右边最小的k轴数。

如果有人能解释一下是如何表示我们找到了第k个元素(在我的例子中是第2个最小的元素),我将不胜感激。如果它的我们是否对枢轴的左侧重复该过程?


共2个答案

匿名用户

是的,当时,您在pivot左侧有元素,这些元素小于pivot,因此您已经找到数组(即pivot)的最小数目,但是如果,在数组左侧搜索,因为pivot&>;第k个最小元素,否则为枢轴(&L);数组的第k个最小元素,因此在右侧搜索以增加枢轴。br>来自维基百科:

// Returns the n-th smallest element of list within left..right inclusive (i.e. n is zero-based).
  function select(list, left, right, n)
     if left = right        // If the list contains only one element
         return list[left]  // Return that element
     pivotIndex  := ...     // select a pivotIndex between left and right, e.g. left + Math.floor(Math.random() * (right - left + 1))
     pivotIndex  := partition(list, left, right, pivotIndex)
     // The pivot is in its final sorted position
     if n = pivotIndex
         return list[n]
     else if n < pivotIndex
         return select(list, left, pivotIndex - 1, n)
     else
         return select(list, pivotIndex + 1, right, n)

希望这有用!

匿名用户

如果k=pivot,则在pivot的左边有k-1个项目。由于进行了分区,这些项中的每一项都比透视项少。此外,由于分区,右侧的每个项都大于透视项。因此,枢轴项必须是最大的第k个。说得通?