haskell实现快排的代码为什么这么短

    如果在某度百科上看过快排词条,同时用自己擅长的语言写过快排的同学,看到词条后面用不同语言实现快排的时候肯定看过haskell的这段快排代码:
q_sort n=case n of
    []->[]
    (x:xs)->q_sort [a|a<-xs,a<=x]++[x]++q_sort [a|a<-xs,a>x]
    what!就这?居然实现了面试官随时可能给你扔过来的“同学,请写一个快排吧”这个问题;你不会在骗我吧。然而并没有,它的确能运行呢,货真价实的快排!

    为什么它能够实现快排呢?首先回到问题根源:快排是什么,用最通俗的话说,快排就是从一堆数里面取一个数a(任意或者按照一定规则取出的一个数,不要在意这些细节),然后把小于它的扔它左边,大于它的扔它右边,三者组合在一起后,对左右的两堆数执行同样的操作,直到不能再分就结束,以空间换时间,最终实现快速排序的目的。

    抛开haskell语法,解释一下上面一段代码到底在是个什么逻辑呢?
q_sort n=case n of    
 //q_sort ->函数名 
 //n->形参 
 //case->暂时可以理解为其类似他语言的分支语句
    []->[] //如果传递的为空,则返回空
    (x:xs)->q_sort [a|a<-xs,a<=x]++[x]++q_sort [a|a<-xs,a>x]
    //这个分支表示不为空的情况
    //(x:xs)-->把传递的数组结构分成首项+剩余两个部分 同时作为参数传递到后面的函数中,首项的作用就是上面说的a啦,当然也可以时最后一项,这里取首项时方便一些
    //[a|a<-xs,a<=x] 这里是什么意思呢?a|,这个a代表输出,可以理解为返回值,a<-xs,a<=x表示这个a从xs中来,同时a小于x,也就是传进来的去掉第一项的数组,输出小于等于x的数组元素,综合来看,这句话实现了:把小的数组元素扔左边的功能;

    //++是拼接的意思
    //
    //[a|a<-xs,a>x]同左边操作类似,返回大于x的所有数组元素
    //q_sort然后再分别对左右进行快排

    是不是有种无语的感觉,这不就是把快排的思路用函数的方式写出来么,的确是这样啊。代码精简,逻辑清晰,关注是什么,而不是实现的细节!
点赞