您的位置:首页 > 编程语言

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

2016-10-01 23:52 585 查看
如果在某度百科上看过快排词条,同时用自己擅长的语言写过快排的同学,看到词条后面用不同语言实现快排的时候肯定看过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然后再分别对左右进行快排


是不是有种无语的感觉,这不就是把快排的思路用函数的方式写出来么,的确是这样啊。代码精简,逻辑清晰,关注是什么,而不是实现的细节!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  haskell