Python實現的快速排序

jeanron100發表於2018-03-28

今天看了下《演算法新解》這本書,很薄的一本書,最開始吸引我的有兩點,一個是裡面的大量的圖,內容相對來說比較清新,第二個是裡面的程式碼是基於Python實現。儘管演算法和語言的關聯實現差別不是很大,重在思想,我是希望直接一些,能看到最直接的就懶得轉換了。

看這本書的時候有幾個瞬間突然有頓悟的感覺。

第一個是一般的翻譯書的內容背景很難轉換,老外舉的例子我們很多時候沒有代入感。在這裡我找到了一些共同的語言,作者看起來是在矽谷工作,舉的一個旅行家問題是以舊金山,帕羅奧圖,伯克利來說明,一看到這個例子,我就能很快想起之前去那邊的行程安排,地圖我已經研究得很熟了,所以再看到這個例子完全不會陌生,還多了一些親切感。這可能就是一些額外的知識補充給帶給我的福利吧。

第二個是對於資料結構設計上和演算法的密切相關,讓我突然理解了資料庫中的設計方式。如果說原來是明白了5分,現在是打通了原來的一道壁壘,我能夠真正的接受那種設計方式。

第三個是對於演算法的設計,排除了我原來的一些盲點。大學看的演算法書都很嚴謹,嚴謹到很多時候看不懂,越是關鍵的演算法,覺得自己花費的腦細胞越多,但是感覺還是不得要領,今天在這裡找到了一些靈感,大概2個多小時的時間,竟然看完了1/3的內容。

演算法是程式設計師的一大利器,做一件事情實現的方式有很多,但是如何平衡找到最合適的方法卻很難。記得大學看一個演算法,花了好幾個小時,結果上課的時候,老師花了不到五分鐘就講完了,然後腦袋一片空白,記得當時學快速排序的時候,感覺這個演算法應該是很複雜,感覺理解了,但是很快就忘記了。如果要落到紙面上完全不行。

第四個是對遞迴的理解。今天看了之後算是重新整理自己的認知。裡面有句話說的好:遞迴將人分為三個截然不同的陣營,恨它的,愛它的,和恨了幾年又愛上它的。我確切的說也是屬於第三種。

使用迴圈,程式的效能可能而更好,但是使用遞迴,程式更容易理解。

對於快速排序,演算法的思考方式就是由簡到難。

如果是一個數,則返回,如果是兩個數,直接比較很快就能出結果,我們用僱一個通用思維來考慮,設定一個參考值,如果大於參考值,則在右側由陣列存放,如果小於參考值,則在左側存放。這樣一來,三個數,四個數都是如此的思路。我們就可以使用遞迴來處理了。

能執行的程式很短,內容如下:

def quicksort(array):

if len(array) < 2:

return array

else:

pivot = array[ 0]

less = [i for i in array[ 1:] if i<= pivot]

greater = [i for i in array[ 1:] if i > pivot]

return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([ 5,11,3,5,8,2,6,7])

如果給程式打上日誌,簡單補充幾個print來看看每個節點的執行情況:

def quicksort(array):

if len(array) < 2:

return array

else:

pivot = array[ 0]

print( "pivot:",pivot)

less = [i for i in array[ 1:] if i<= pivot]

print( "less:",less)

greater = [i for i in array[ 1:] if i > pivot]

print( "greater",greater)

print( "sum:",(less) + [pivot] + (greater))

return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([ 5,11,3,5,8,2,6,7])

生成的日誌如下:

D:programspython2 .7python.exe C:/python/kmp/db_ops/quicksort.py

( 'pivot:', 5)

( 'less:', [ 3, 5, 2])

( 'greater', [ 11, 8, 6, 7])

( 'sum:', [ 3, 5, 2, 5, 11, 8, 6, 7])

( 'pivot:', 3)

( 'less:', [ 2])

( 'greater', [ 5])

( 'sum:', [ 2, 3, 5])

( 'pivot:', 11)

( 'less:', [ 8, 6, 7])

( 'greater', [])

( 'sum:', [ 8, 6, 7, 11])

( 'pivot:', 8)

( 'less:', [ 6, 7])

( 'greater', [])

( 'sum:', [ 6, 7, 8])

( 'pivot:', 6)

( 'less:', [])

( 'greater', [ 7])

( 'sum:', [ 6, 7])

[ 2, 3, 5, 5, 6, 7, 8, 11]

Process finished with exit code 0

對於分析問題還是大有幫助。程式本身不長,算是我見過最精煉的快排程式了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2152337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章