:병합 반전 수가 사용 포함 해서요 정렬 I 정렬 병합하여 반전의 수를 카운트 할 필요
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))
그러나 시도한 결과 실패했습니다.
어떻게하면됩니까?
UPDATE : 어큐뮬레이터와
버전 :
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는 : 오류가 어디
하고 실제로 제대로을 계산하지 않습니다, 나는 찾을 수 없습니다.
어쩌면 역전을 의미할까요? – Aravind
@Aravind, 예 .. –
: 아마도 도움이 될 것입니다 : https://class.coursera.org/algo-2012-002/lecture/15 https://class.coursera.org/algo-2012-002/lecture/16 – Aravind