標籤:des style blog http color strong
記錄學習點滴
快速排序演算法是一種很有趣的演算法,短小精悍,效能強勁,對於大部分情況都可以勝任,但對極端環境難以應付。
快速排序我理解為:這是一個“以自我為中心的”+“分治法”思想的演算法。
分治法不必多說,化繁為簡,那就是逐個擊破。
那什麼是“以自我為中心”?顧名思義,就是每次都一個“我”,每個人都要圍繞“我”行事,比“我”小的都去左邊站著,比“我”他大的都去右邊站著,而且“我”不去關心每一邊都有誰,反正你沒“我”大或者小就行。一旦“我”落位了妥帖了,“我”就不動了。然後再在左右兩邊分別產生新“我”,重複上述步驟。
那大家又是如何以“我”為中心的呢?有兩種方式,一種是單邊掃描,一種是兩頭掃描。
1.單邊掃描
即總是選取一個數組的最右邊為主元("我"),按照《導論》,設定兩個標記,i和j,i標記分界點(左邊為小的,右邊為大的),j為掃描器(從頭到尾遍曆數組)如所示。i的作用是標記位置,左邊為小的,右邊為大的;j的作用是發現比4(“我”)小的數,然後和i+1的換位置,最後將“我”放在正確的位置上
按照《導論》,代碼如下
1 def Partition_OneSideScan(A,p,r):#單邊掃描 2 i = p-1 3 x = A[r-1] 4 for j in range(p,r): 5 if A[j-1] <= x: 6 i = i+1 7 A[i-1],A[j-1] = A[j-1],A[i-1] 8 9 A[r-1],A[i] = A[i],A[r-1]10 return i+1 #返回一個Base點
2.兩頭掃描
兩頭掃描,就是兩邊一起掃描,遇到比“我”大的放到右面,遇到比“我”小的放在左面,具體到代碼如何??最好的方法是白話經典演算法系列之六 快速排序 快速搞定中提到的“坑”,非常形象,很容易理解(大牛就是大牛,By the way,我認為最好的理解方式就是舉例子,作比喻)。
在這裡畫個圖來描述其思想。
代碼實現,可以去看大牛寫的代碼。
最後,通過遞迴調用實現快速排序,代碼如下:
1 def QuickSort(A,p,r):#快速排序的分治法部分2 if p<r:3 q = Partition_DigHole(A,p,r)4 QuickSort(A,p,q-1)5 QuickSort(A,q+1,r)