【问题标题】:Can QuickSelect find smallest element in an Array with duplicate values?QuickSelect 可以找到具有重复值的数组中的最小元素吗?
【发布时间】:2018-11-10 09:35:37
【问题描述】:

QuickSelect 算法是否适用于重复值?

如果我有一个数组

int[] array = {9, 8, 7, 6, 6, 6, 5, 0, 1, 2, 3, 4, 5, 5, 7, 200};

即使有重复,它是否能够得到第k个最小的元素?

【问题讨论】:

  • 是的,它会工作,并为 K 的范围返回相同的值。
  • 你能详细解释一下吗?我们说如果我们在例如中间选择一个枢轴,那么我们进行分区,如果 k 小于枢轴,我们只需要查看左子数组。所以现在我们知道第 k 个元素必须在左侧的区域 k-1 中。但是如果有重复的值你不能说k-1个值?
  • 在分区过程中,必须确保两个子数组中没有一个为空。这保证了最终只剩下一个元素。

标签: algorithm sorting big-o quickselect


【解决方案1】:

是的,它有效。在每次迭代结束时,所有小于当前主元的元素都存储在主元的左侧。

让我们考虑所有元素都相同的情况。在这种情况下,每次迭代最终都会将枢轴元素放在数组的左侧。下一次迭代将继续使用一个元素较短的数组。所以我们需要k迭代来找到第k个最小的元素。

【讨论】:

  • @mth1417 是的,快速选择与快速排序非常相似,您只需从右侧向左继续,而不像快速排序那样双向。
  • @mth1417 快速排序是世界上使用非常广泛的排序技术,可能是最常用的一种。那不会,所以它不适用于具有重复项的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2018-11-07
  • 2021-12-27
  • 2016-10-28
  • 2012-08-16
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多