我必须在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))
}
}
有人可以向我解释吗?
答案 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();
。