scala 归并排序详解(一步一结果)

先贴源码(欢迎大佬指正)

object sortimp {
  def main(args: Array[String]): Unit = {
    val list = List[Int](5,2,21,34,11)
    val xx = msort(list)
    print(xx)
  }
  def msort[T](xs: List[T])(implicit ord: Ordering[T]): List[T] = {
    def merge(xs: List[T], ys: List[T]): List[T] = (xs, ys) match {
      case (Nil, _) => ys
      case (_, Nil) => xs
      case (x :: xs1, y :: ys1) => if (ord.lt(x, y)) x :: merge(xs1, ys) else y :: merge(xs, ys1)
    }
    val n: Int = xs.length / 2
    if (n == 0) xs
    else {
      val (left, right): (List[T], List[T]) = xs.splitAt(n)
      merge(msort(left)(ord), msort(right)(ord))
    }
  }
}

调用函数 msort 第二个参数implicit ord: Ordering[T] 为比较器,这里就不赘述了
直接上分析结果

将数据拆解到底(即单个元素)
merge(
	merge(
		merge(
			merge({5})
			,merge({2})
			)
		,megre({21})
		),
	merge(
		megre({34})
		,megre({11}))
)
第一步合并+排序
merge(
	merge(
		merge(
			{5}
			,{2})
			
		,{21}
		),
	merge(
		{34}
		,{11})
)
第二步合并+排序
merge(
	merge(
		{2,5}
		,{21}
		),
	{11,34}
)
第三步合并+排序
merge(
	{2,5,21},
	{11,34}
)
最终结果
{2,5,11,21,34}

拆解的代码: val n: Int = xs.length / 2
如有错误,欢迎留言,小弟致谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值