0

我在理解快速选择算法时遇到问题。我知道它基于快速排序算法(我很熟悉),它可以为您提供所需的结果,可能会使数组的一部分未排序。现在这是我遇到困难的地方。问题是从数组中找到第二个最小的元素:

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

现在假设我们随机选择枢轴然后根据这篇文章我们有以下条件:

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

  • k < pivot. 然后第 k 个最小的在枢轴的左侧。

  • k > pivot. 然后第 k 个最小的在枢轴的右侧。要找到它,您实际上必须在右侧找到 k-pivot 最小数字。

如果有人能解释k==pivot 我们如何找到第 k 个(在我的情况下是第二个最小元素),我将不胜感激。此外,如果k < pivot我们是否重复枢轴左侧的过程?

4

2 回答 2

2

如果 k = pivot 的话,pivot 左边会有 k-1 个项目。由于分区,这些中的每一个都小于枢轴项。此外,由于分区,右侧的每个项目都大于枢轴项目。因此,枢轴项目必须是第 k 个最大的。说得通?

于 2014-03-16T07:14:27.333 回答
1

是的,当枢轴左侧有小于pivok == k枢轴的元素时,您找到了数组的最小编号,即枢轴,但是如果,请在数组左侧搜索,因为枢轴>第k个最小元素,否则pivot < kth 数组的最小元素,因此在右侧搜索以增加 pivot 。 来自维基百科k-1k-thk < pivot

// 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)

希望这可以帮助 !

于 2014-03-16T07:13:11.617 回答