归并操作的工作原理如下:第一步:申请空间,使其大小为两个已经 排序序列之和,该空间用来存放合并后的序列第二步:设定两个 指针,最初位置分别为两个已经排序序列的起始位置第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾归并 排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比 快速排序优势的地方.(速度仅次于 快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的 数列,应用见2011年普及复赛第3题“瑞士轮”的标程)具体思路是,在归并的过程中计算每个小区间的逆序对数,进而计算出大区间的逆序对数(也可以用 树状数组来求解)scala代码:objectMainextendsApp { varreverse_pairs = 0//逆序数 defmsort[T](cmp:(T, T) => Boolean)(l:List[T]):List[T] = { defmerge(l1:List[T], l2:List[T]):List[T]=(l1, l2)match { case(Nil, _) => l2 case(_, Nil) => l1 case(x::left1, y::left2) => if(cmp(x, y)) x::merge(left1, l2) else{ reverse_pairs += l1.length y::merge(l1, left2) } } valn = l.length / 2 if(n == 0) return l else{ val(l1, l2) = l.splitAt(n) merge(msort(cmp)(l1), msort(cmp)(l2)) } } println(msort((x:Int, y:Int) => x