object MergeSort {
def merge(l1: List[Int], l2: List[Int]):List[Int] =(l1, l2) match {
case (Nil, _) => l2
case (_, Nil) => l1
case (h1::t1, h2::t2) =>
if(h1<h2) h1::merge(t1, l2)
else h2::merge(l1, t2)
}
def mergesort(list: List[Int]):List[Int]=list match {
case Nil => list
case h::Nil => list
case _=>
val (l1, l2)=list.splitAt(list.length/2)
merge(mergesort(l1), mergesort(l2))
}
def main(args: Array[String]): Unit = {
val num=List(1, 4, 8 , 2, 10)
println(mergesort(num))
}
}
运行结果
MapReduce中有两次归并排序算法的使用.
第一次发生在Map任务完成之前, 磁盘上存放着多个完成分区, 完成排序的文件, 这时需要将这些文件进行一次整合, 合并成一个已经分好区并排好序的文件, 由于在溢写阶段已经进行过一次快排, 所以一次归并就能完成排序.
第二次归并发生在shuffle阶段, 需要将多个Map任务的输出文件合并, 也是只需一次归并即可完成.