首先,我想说这是一个学校作业,我只是寻求一些指导。
我的任务是编写一个算法,使用快速选择找到序列中的第 k 个最小元素。这应该很容易,但是在运行一些测试时我碰壁了。出于某种原因,如果我使用输入(List(1, 1, 1, 1), 1)
,它会进入无限循环。
这是我的实现:
val rand = new scala.util.Random()
def find(seq: Seq[Int], k: Int): Int = {
require(0 <= k && k < seq.length)
val a: Array[Int] = seq.toArray[Int] // Can't modify the argument sequence
val pivot = rand.nextInt(a.length)
val (low, high) = a.partition(_ < a(pivot))
if (low.length == k) a(pivot)
else if (low.length < k) find(high, k - low.length)
else find(low, k)
}
由于某种原因(或因为我累了),我无法发现我的错误。如果有人能提示我哪里出错了,我会很高兴。