如何使用合并排序为Scala中的Int列表计算反转计数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用合并排序为Scala中的Int列表计算反转计数?相关的知识,希望对你有一定的参考价值。

def mergeSort(xs: List[Int]): List[Int] = {
    val n = xs.length / 2
    if (n == 0) xs
    else {
        def merge(xs: List[Int], ys: List[Int]): List[Int] =
            (xs, ys) match {
            case(Nil, ys) => ys
            case(xs, Nil) => xs
            case(x :: xs1, y :: ys1) =>
                if (x < y) {
                    x :: merge(xs1, ys)
                }
                else {
                    y :: merge(xs, ys1)
                }
            }
        val (left, right) = xs splitAt(n)
        merge(mergeSort(left), mergeSort(right))
    }
}

数组的反转计数表示 - 数组的排序距离(或接近)。如果数组已经排序,则反转计数为0.如果数组按相反顺序排序,则反转计数最大。从形式上讲,如果[i]> a [j]和i <j,则两个元素a [i]和a [j]形成反转

示例:序列2,4,1,3,5具有三个反转(2,1),(4,1),(4,3)。

因此,如果将此列表(2,4,1,3,5)传递给函数,则反转计数应为3。

如何添加变量来获取数字?

以上是关于如何使用合并排序为Scala中的Int列表计算反转计数?的主要内容,如果未能解决你的问题,请参考以下文章

Scala:将地图列表与每个键的最大值合并的惯用方法?

如何使用归并排序计算大量输入的反转次数

计算数组中的反转

使用 Spark Scala 进行区间合并

我无法在合并排序中使用java获得反转次数

如何将折叠左侧运算符“:/”转换为scala中的foldLeft函数?