谁能解释以下Scala代码?

时间:2020-05-07 10:03:19

标签: scala intellij-idea bubble-sort

我必须在Scala中描述BubbleSort,并使用此代码对其进行了测试。但是我不确切知道每个函数的作用。

object BubbleSort {
  def sort(list: List[Int]): List[Int] = list match {
    case List() => List()
    case head :: tail => compute(head, sort(tail))
  }

  def compute(data: Int, dataSet: List[Int]): List[Int] = dataSet match {
    case List() => List(data)
    case head :: tail => if (data <= head) data :: dataSet else head :: compute(data, tail)
  }

  def main(args: Array[String]) {
    val list = List(3, 12, 43, 23, 7, 1, 2, 0)
    println(sort(list))
  }
}

有人可以向我解释吗?

2 个答案:

答案 0 :(得分:2)

从最后一个元素开始查看功能

sort(List()) // List()
compute(0, List()) // List(0)
sort(List(0))      // List(0)
compute(2, List(0)) // List(0, 2)
sort(List(2, 0))    // List(0, 2)
compute(1, List(0, 2)) // List(0, 1, 2)
sort(List(1, 0, 2))    // List(0, 1, 2)
compute(7, List(0, 1, 2)) // List(0, 1, 2, 7)
sort(List(7, 0, 1, 2))    // List(0, 1, 2, 7)
compute(23, List(0, 1, 2, 7)) // List(0, 1, 2, 7, 23)
sort(List(23, 0, 1, 2, 7))    // List(0, 1, 2, 7, 23)
compute(43, List(0, 1, 2, 7, 23)) // List(0, 1, 2, 7, 23, 43)
sort(List(43, 0, 1, 2, 7, 23))    // List(0, 1, 2, 7, 23, 43)
compute(12, List(0, 1, 2, 7, 23, 43)) // List(0, 1, 2, 7, 12, 23, 43)
sort(List(12, 0, 1, 2, 7, 23, 43))    // List(0, 1, 2, 7, 12, 23, 43)
compute(3, List(0, 1, 2, 7, 12, 23, 43)) // List(0, 1, 2, 3, 7, 12, 23, 43)
sort(List(3, 0, 1, 2, 7, 12, 23, 43))    // List(0, 1, 2, 3, 7, 12, 23, 43)

compute将元素(“气泡”)推到适当的位置。

答案 1 :(得分:1)

首先,冒泡排序的classic definition涉及交换相邻元素(如果它们顺序混乱)。这里没有进行任何交换,因此它看起来并不像真正的冒泡排序。

更确切地说,compute()方法可能被称为insert(),因为它就是这样做的。它将data元素插入已经排序的dataSet中。最简单的情况是data元素属于dataSet的头部(或仅属于dataSet的元素)。如果不是这种情况,则将当前data的开头放在一边(在调用堆栈上)并递归直到dataSet 放在开头,然后取消调用栈,使用最新的data元素重建sort()

list方法要简单一些。它只是将当前list的头部拉开,并将其放置在调用堆栈中,直到compute()为空,然后进行排序。然后展开,将每个元素以及上一次调用返回的排序结果传递给var value = "231143"; var array = value.Select(c => c - '0').ToArray();