一个有趣的函数式插入排序实现

Posted 鸿的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个有趣的函数式插入排序实现相关的知识,希望对你有一定的参考价值。

分享一个有趣的函数式的插入排序实现方式,它利用Scala的模式匹配和列表的操作,通过递归的方式给列表排序,大概流程是有一个列表x::xs,先对xs排序。再将x插入到正确的位置。

def isort(xs:List[Int]):List[Int] = xs match {
   case List()  => List()
   case x :: xs1 => insert(x, isort(xs1))
 }

def insert(x:Int, xs:List[Int]):List[Int] = xs match {
   case List() => List(x)
   case y :: ys => if (x <= y) x :: xs
                    else y :: insert(x,ys)
 }

产生的效果就是

scala> isort(List(34,53,53,7,35,1))
res8: List[Int] = List(1, 7, 34, 35, 53, 53)

然后把这两个函数拆解,看看是怎么排序的,先对insert函数稍作改造:

  def insert(x:Int, xs:List[Int]):List[Int] = xs match {
   case List() => List(x)
   case y :: ys => if (x <= y) {
                        println(s"x:$x")
                        println(s"xs:$xs")
                        x :: xs}
                    else
                    {
                      println(s"x:$x")
                      println(s"xs:$xs")
                      y :: insert(x,ys)}
                     }

输出结果为:

scala> isort(List(34,53,53,7,35,1))
x:35
xs:List(1)
x:7
xs:List(1, 35)
x:7
xs:List(35)
x:53
xs:List(1, 7, 35)
x:53
xs:List(7, 35)
x:53
xs:List(35)
x:53
xs:List(1, 7, 35, 53)
x:53
xs:List(7, 35, 53)
x:53
xs:List(35, 53)
x:53
xs:List(53)
x:34
xs:List(1, 7, 35, 53, 53)
x:34
xs:List(7, 35, 53, 53)
x:34
xs:List(35, 53, 53)
res0: List[Int] = List(1, 7, 34, 35, 53, 53)

这个的函数流程可以这么理解,列表会从最后一个元素开始往上比较排序,每一的比较都是采用需要比较的元素通过递归的方式与已有列表的元素比较放入到一个合适的位置,再和头元素拼接在一起。


以上是关于一个有趣的函数式插入排序实现的主要内容,如果未能解决你的问题,请参考以下文章

将数字插入排序的数字数组的有效方法?

数据结构图解七大排序

7种基本排序算法的Java实现

Java数据结构—排序算法

算法导论 | 循环不变式与插入排序

C语言编程实例7