如果在某度百科上看过快排词条,同时用自己擅长的语言写过快排的同学,看到词条后面用不同语言实现快排的时候肯定看过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
[]->[]
(x:xs)->q_sort [a|a<-xs,a<=x]++[x]++q_sort [a|a<-xs,a>x]
是不是有种无语的感觉,这不就是把快排的思路用函数的方式写出来么,的确是这样啊。代码精简,逻辑清晰,关注是什么,而不是实现的细节!