【发布时间】:2013-07-12 06:02:06
【问题描述】:
我需要使用归并排序来计算反转次数:
object Example {
def msort(xs: List[Int]): List[Int] = {
def merge(left: List[Int], right: List[Int]): Stream[Int] = (left, right) match {
case (x :: xs, y :: ys) if x < y => Stream.cons(x, merge(xs, right))
case (x :: xs, y :: ys) => Stream.cons(y, merge(left, ys))
case _ => if (left.isEmpty) right.toStream else left.toStream
}
val n = xs.length / 2
if (n == 0) xs
else {
val (ys, zs) = xs splitAt n
merge(msort(ys), msort(zs)).toList
}
}
msort(List(8, 15, 3))
}
我想我必须在行中算(y < y,第二行在match)
case (x :: xs, y :: ys) => Stream.cons(y, merge(left, ys))
但是,当我尝试时,我失败了。
我该怎么做?
更新:
带有累加器的版本:
def msort(xs: List[Int]): List[Int] = {
def merge(left: List[Int], right: List[Int], inversionAcc: Int = 0): Stream[Int] = (left, right) match {
case (x :: xs, y :: ys) if x < y => Stream.cons(x, merge(xs, right, inversionAcc))
case (x :: xs, y :: ys) => Stream.cons(y, merge(left, ys, inversionAcc + 1))
case _ => if (left.isEmpty) right.toStream else left.toStream
}
val n = xs.length / 2
if (n == 0) xs
else {
val (ys, zs) = xs splitAt n
merge(msort(ys), msort(zs)).toList
}
}
如何轻松返回inversionAcc?我想,我只能像这样将它作为元组的一部分返回:
def merge(left: List[Int], right: List[Int], invariantAcc: Int = 0): (Stream[Int], Int)
虽然看起来不太好。
UPDATE2:
而且它实际上并没有正确计算,我找不到错误在哪里。
【问题讨论】:
-
也许你的意思是倒置?
-
我在弗雷格的解决方案可能会对您有所帮助:stackoverflow.com/questions/14968480/…
-
@Aravind,它没有。
-
“当我尝试时我失败了”——显示您尝试过的内容以及失败的地方。
标签: algorithm scala sorting mergesort