【发布时间】:2021-07-25 13:02:03
【问题描述】:
我正在尝试在数组中找到第 K 个最小的元素 => val a = Array[Int](10, 1, 7, 2, 25, 11, 14)
为此,我使用了快速排序算法的枢轴机制。基于 Pivot 位置,我从start to pivot position 或pivot+1 position to the end of the array 递归调用pivot 方法。
下面是我写的逻辑。
object KthLargestSmallestOfArray extends App {
val a = Array[Int](10, 1, 7, 2, 25, 11, 14)
val k = 3
println(kthSmallest(a, 0, a.length-1, k))
def partition(arr: Array[Int], low: Int, high: Int): Int = {
val pivot = high
var i = low - 1
for(j <- low until high) {
if(arr(j)<arr(pivot)) {
i += 1
swap(arr, i, j)
}
}
swap(arr, i+1, high)
i+1
}
def swap(arr: Array[Int], l: Int, h: Int): Unit = {
val temp = arr(l)
arr(l) = arr(h)
arr(h) = temp
}
@tailrec
def kthSmallest(arr: Array[Int], p: Int, q: Int, index: Int): Int = {
if(p==q && p==index) {
arr(p)
} else {
val r = partition(arr, p, q)
if(r == k) {
arr(r)
} else if(r < k) {
kthSmallest(arr, r+1, q, k)
} else kthSmallest(arr, p, r-1, k)
}
}
}
当我运行代码时,输入 k = 3,代码将 10 作为输出。
如果我对数组的元素进行排序 => (1, 2, 7, 10, 11, 14, 25),7 是第三大元素。
数组有 10 作为它的第 4 个元素(0 到 3..6),并且数组(k)是 10,因此它返回 10。
如果我将 k 提供为 4,则输出为 11,依此类推。
无论如何我可以返回 7 而不是 10 吗?因为 7 是从头开始的第三小的元素,它与我提供的 k 的值匹配。
谁能告诉我我在哪里犯了错误,我该如何纠正它?
【问题讨论】:
-
您了解 QuickSelect 算法吗? en.wikipedia.org/wiki/….
-
我知道,但我不能使用分区进行排序。相反,我只需要返回
K的值 -
这不是你要找的错误,但是注意在
kthSmallest方法中使用index而不是k(或者只是将index重命名为k),否则您将使用本地范围之外的值而不是参数)。 -
刚刚注意到@trincot 的答案中已经报告了这一点。