Python實現的快速排序
今天看了下《演算法新解》這本書,很薄的一本書,最開始吸引我的有兩點,一個是裡面的大量的圖,內容相對來說比較清新,第二個是裡面的程式碼是基於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 快速排序的四種python實現排序Python
- Python3實現快速排序Python排序
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- java實現快速排序Java排序
- Swift實現快速排序Swift排序
- GO 實現快速排序Go排序
- 快速排序(java實現)排序Java
- 快速排序 java實現排序Java
- 排序演算法之快速排序的實現排序演算法
- php實現 歸併排序,快速排序PHP排序
- 快速排序三種實現排序
- Go實現氣泡排序和快速排序Go排序
- 三種語言實現快速排序(C++/Python/Java)排序C++PythonJava
- python 快速排序Python排序
- JavaScript實現標準快速排序JavaScript排序
- 快速理解7種排序演算法 | python3實現(排序演算法Python
- 歸併排序與快速排序的一個實現與理解排序
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- 快速排序的三種實現方法 (C++)排序C++
- Python實現氣泡排序Python排序
- 選擇排序(python)實現排序Python
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- Sort排序專題(5)快速排序(QuickSort)(C++實現)排序UIC++
- 排序演算法-Java實現快速排序演算法排序演算法Java
- 隨機快速排序Java程式碼實現隨機排序Java
- 快速排序演算法C++實現排序演算法C++
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 直播系統原始碼,實現快速排序和歸併排序原始碼排序
- python根據字典內的值實現排序Python排序
- 常見排序原理及 python 實現排序Python
- 二十、快速排序演算法——JAVA實現(遞迴)排序演算法Java遞迴
- 好程式設計師Python學習路線分享實現快速排序演算法程式設計師Python排序演算法
- python實現希爾排序演算法Python排序演算法
- Array.sort 演算法原理(插入排序\快速排序in-place實現)演算法排序
- 服務計算 TDD實踐——實現快速排序演算法排序演算法
- python實現常見的五種排序演算法Python排序演算法
- 八大排序演算法的python實現排序演算法Python
- Python進階-演算法-快速排序Python演算法排序