算法小專欄:“D&C思想”與“快速排序”

級別: ★☆☆☆☆
標簽:「算法」「D&C」「quickSort」
作者: MrLiuQ
審校: QiShare團隊


前一篇介紹了遞歸與尾遞歸,本篇將基于遞歸介紹快速排序等相關內容。

閱讀本文你將收獲:

  • 分而治之思想:簡稱D&C,一種遞歸式解決問題方案。
  • 快速排序:利用D&C思想,實現的一種高效排序方法。

一、“分而治之”思想(D&C)

分而治之:(divide and conquerD&C)是一種著名的遞歸式解決問題的方法。

某一種解決問題的算法用處有限,而D&C為我們提供的是一種思路。
當我們面對一個復雜問題手足無措時,我們應該自問:“D&C能解決該問題么?”

那么,D&C是什么?

1.1 什么是D&C?

使用D&C解決問題的過程分為兩個步驟:

  1. 找出基線條件,這個條件盡可能簡單。(基線條件的定義見上篇
  2. 不斷將問題分解(縮小規模),直到全部符合基線條件。

1.2 D&C的實例

場景:假設你是一位農場主,你有一塊長方形(168m x 64m)的地。

問題:現在你需要把這塊地分成若干個正方形的地(方便管理和種菜),問最大能拆分成多大的小正方形。(注意:不能留空地哦,最大利用土地資源)

  • 方案一:找出“長”和“寬”中,相同的最大的公約數即可。(我的第一反應是這樣算)

  • 方案二:使用D&C思想,先從大長方形中去掉幾個最大的正方形,再去掉小長方形的幾個最大正方形,不斷尋找,直到沒有小長方形為止。

步驟:

  1. 找到基線條件:長是寬的整數倍
  2. 不斷分解:去除所有最大正方形后,對小長方形進行分解

圖解如圖:

第一次:找到兩個邊長為64m的大正方形,去除后,留下64m x 40m的小長方形。

第二次:找到一個邊長為40m的小正方形,去除后,留下40m x 24m的小長方形。

第三次:找到一個邊長為24m的小正方形,去除后,留下24m x 16m的小長方形。

第四次:找到一個邊長為16m的小正方形,取出后,留下16m x 8m的小長方形。

第五次:找到兩個邊長為8m的小正方形,正好分完。

因此,該農場分為小正方形田地的最大邊長為8m。

而這個解決問題的思想,就是D&C思想。

我們再來回顧一下D&C思想的核心:

  • 找出簡單的基線條件。
  • 確定如何縮小問題的規模,使其符合基線條件。

二、快速排序

快速排序(QuickSort)利用的就是D&C思想。它是一種高效的排序方案。

2.1 快排的思想(基于D&C)

  • 基線條件:當排序數組元素個數小于2個時,直接返回。
  • 縮小規模:每次從待排序數組中選取一個元素(基準值),把小于等于該元素的元素放在一側,把大于該元素的元素放在另一側。再對兩邊的小數組做重復操作。

2.2 快排的示例

基于Python,實現了一個快排:
代碼如下:

def quickSort(arr):
    if len(arr) < 2:
        return arr
    else:
        pivot = arr[0]
        less = [i for i in arr[1:] if i <= pivot]
        greater = [i for i in arr[1:] if i > pivot]

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

print quickSort([10, 2, 6, 4, 7, 2])

解讀一下代碼:

PS:基準值一般可以選取第一個元素,也可以選擇最后一個元素。

2.3 快排的動畫演示

本Demo中,選取的數組的最后一個元素為基準值,把小于等于基準值的元素放在左側,大于基準值的元素放在右側。


推薦文章:
iOS 避免常見崩潰(二)
算法小專欄:選擇排序
iOS Runloop(一)
iOS 常用調試方法:LLDB命令
iOS 常用調試方法:斷點
iOS 常用調試方法:靜態分析
iOS 消息轉發

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、 單項選擇題(共71題) 對n個元素的序列進行冒泡排序時,最少的比較次數是( )。A. n ...
    貝影閱讀 9,259評論 0 10
  • 1. 關于診斷X線機準直器的作用,錯誤的是()。 (6.0 分) A. 顯示照射野 B. 顯示中心線 C. 屏蔽多...
    我們村我最帥閱讀 10,834評論 0 5
  • 學習分而治之(divide and conquer, D&C)——快速排序 書中先講了一個小案例,如果將一塊長方形...
    天驅丶閱讀 252評論 0 0
  • 我是誰? 一個處在迷茫期的女青年 生活工作一團糟的孤獨者 愛哭愛鬧愛笑愛瘋的逗逼 安靜文藝內向努力的學生 以上,都...
    六翎閱讀 293評論 0 1
  • 多少次信誓旦旦的承諾,被生活收藏;多少次承諾的明天變成昨天。是生活先對我動了手,還是我根本就不懂得生活。 曾經,我...
    艾孤璟閱讀 245評論 0 0