1. 程式人生 > >haskell實現快排的程式碼為什麼這麼短

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然後再分別對左右進行快排
    是不是有種無語的感覺,這不就是把快排的思路用函式的方式寫出來麼,的確是這樣啊。程式碼精簡,邏輯清晰,關注是什麼,而不是實現的細節!