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然后再分别对左右进行快排
是不是有种无语的感觉,这不就是把快排的思路用函数的方式写出来么,的确是这样啊。代码精简,逻辑清晰,关注是什么,而不是实现的细节!
相关文章推荐
- 给人讲快一年前的代码,突然看到一段,忘了为什么这么实现的,自己看了下注释才想起来
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- Android拾萃 - 从零打造一个RxJava(搞清楚RxJava代码为什么这么写)
- 为什么他们这么写代码:序言
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 为什么C++编译器不支持模板头文件和实现代码分离的编
- haskell实现多线程服务器实例代码
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 为什么你的android代码这么混乱
- javascript代码为什么运行这么慢?
- haskell实现多线程服务器实例代码
- 虚拟现实为什么这么难实现?
- 点击一个按钮实现在不同对话框之间的切换,帮忙看下这代码能不能这样写,为什么不对呀
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- 为什么C++编译器不支持模板头文件和实现代码分离的编译
- COM进程外服务器实现 QueryInterface时,这样的代码为什么不行?
- 为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?
- OpenGL蓝宝书第六章代码疑虑:为什么使用了GL_TEXTURE_1D??纹理和顶点间的映射是如何实现?
- 为什么我们的代码这么落后?