排序演算法系列——快速排序

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   strong   

記錄學習點滴

快速排序演算法是一種很有趣的演算法,短小精悍,效能強勁,對於大部分情況都可以勝任,但對極端環境難以應付。

快速排序我理解為:這是一個“以自我為中心的”+“分治法”思想的演算法。

分治法不必多說,化繁為簡,那就是逐個擊破。

那什麼是“以自我為中心”?顧名思義,就是每次都一個“我”,每個人都要圍繞“我”行事,比“我”小的都去左邊站著,比“我”他大的都去右邊站著,而且“我”不去關心每一邊都有誰,反正你沒“我”大或者小就行。一旦“我”落位了妥帖了,“我”就不動了。然後再在左右兩邊分別產生新“我”,重複上述步驟。

那大家又是如何以“我”為中心的呢?有兩種方式,一種是單邊掃描,一種是兩頭掃描。

1.單邊掃描

即總是選取一個數組的最右邊為主元("我"),按照《導論》,設定兩個標記,iji標記分界點(左邊為小的,右邊為大的),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)

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.