一、分而治之
一種著名的遞迴式問題解決方法。英文全稱(divide and conquer),簡稱d&c,它提供了解決問題的思路。
使用d&c解決問題的過程需要兩個步驟:
1、找出基線條件,這種條件必須盡可能簡單;
2、不斷將問題分解(或者說縮小規模),直到符合基線提交。(遞迴條件)
舉例:假如你有一塊土地,它的長是1680公尺,寬是640公尺;你要將這塊地均勻分成方塊,且分出的方塊要盡可能大。
根據d&c解決問題的兩個步驟:
基線條件:最容易想到的就是一條邊的長度是另一條邊的整數倍;如果乙個邊長是25m,另乙個邊長是50m,那麼可用的最大方塊就是25m*25m。
遞迴條件:每次遞迴呼叫都必須縮小問題的規模,直到符合基線條件。所以按照這個思路,我們可以對這塊地進行第一次的切割,640m*640*,餘下640m*240m,下次再以240m為邊長進行切割,依次類推,最終發現80m*80m就是我們最終要確認的方塊大小。
在這裡有乙個很重要的概念,歐幾里得演算法:即適用於這小塊地的最大方塊,也是適用於整塊地的最大方塊。
小結:1、找出簡單的基線條件;
2、確定如何縮小問題的規模,使其符合基線條件;
3、編寫涉及陣列遞迴時,基線條件通常為:陣列為空或只包含乙個元素。
二、快速排序
快速排序是對氣泡排序的一種改進。
它的基本思路是:通過一次排序將 要排序的陣列分成兩個部分,其中一部分所有資料都比另一部分所有資料都要小,然後再依次對這兩部分資料進行快速排序,整個排序過程可以遞迴進行,以達到整個資料變成有序的序列。
先來看乙個示例,使用快速排序對陣列l[3,2,5,9,4,0,7]進行排序。
既然快速排序應用到遞迴,我們可以用上節中d&c方法來解決問題。想想上節的遞迴解決方法:
第一步:確認基線條件
先不要受給出示例的影響,想一想,對排序演算法來說,最簡單的陣列是什麼樣呢?當然就是壓根就不需要排序的陣列唄,也就是空陣列或只包含乙個元素的陣列啦~
因此,第一步的基線條件為:len(l)<2,這種情況就包括了空陣列和只有1個元素的陣列。
第二步:不斷將問題分解(縮小問題的規模),直到滿足基線條件;
於是我們開始分解列表元素大於等於2種的情況,基於d&c的解題思路中不斷縮小問題的規模:
所以,我們假設這個陣列只有2個元素:如果第乙個元素比第二個元素大,就交換他們的位置;
如果是3個元素呢,還是應用d&c的解決思路,此時我們可以任意從陣列中選擇乙個元素作為基準值,接下來,就找出比基準值小的元素和比基準值大的元素;那麼現在,我們是不是就有了乙個比基準值小的子陣列;基準值;乙個比基準值大的子陣列;然後我們再對子陣列進行快速排序,你發現沒有,不管何種情況,兩個子陣列最多隻含有2個元素;2個元素的陣列排序問題我們已經解決了,此處就是遞迴的方式,最終我們將這它們串聯到一起:[比基準值小的子陣列]+[基準值]+[比基準值大的子陣列],最終就會形成乙個有序的陣列。
總結如下,這也是快速排序的核心步驟:
1、選擇基準值;
2、將陣列分成兩個子陣列:小於基準值的元素和大於基準值的元素;
3、對這兩個子陣列進行快速排序(也就是重複第2步)。
上述完整**如下:
至此,你發現乙個規律嗎?(如果感興趣,可以看下數學歸納法,也稱歸納證明)
如果乙個快速排序對包含乙個元素的陣列管用,對包含兩個元素的陣列也將管用;如果對包含兩個元素的陣列管用,對包含三個元素的陣列也將管用;以此類推!因此,可以看出,快速排序對任何長度的陣列都管用。
上述**一種更優雅的寫法:
細心的你,發現上述兩種寫法更深一層的意義了嗎?
是的,兩種寫法最關鍵的區別就是選擇的基準值不一樣,所以說快速排序的效能依賴與你選擇的基準值。
三、平均情況和糟糕情況
示例:乙個有序序列[1,2,3,4,5,6,7,8]
假設你總將第乙個元素作為基準值,這使得呼叫棧的高度為8,而如果你總是將陣列中間的元素作基準值,呼叫棧的高度為4。
第一種方法為糟糕情況,此時棧長為o(n);第二種方法為最佳情況,此時棧長為o(log n);而不管如何劃分陣列,每次所有的時間都是o(n),即最糟情況下所用的時間為o(n)*o(n)=o(n²);而最佳情況下所用時間為o(log n)*o(n)=o(n log n),這裡要說明的是,最佳情況即平均情況。
分治法之快速排序演算法解題思路
快速排序演算法的基本思想是 先找乙個基準元素 比如待排序陣列的第乙個元素 進行一趟快速排序,使得該基準元素左邊的所有資料都它小,而右邊的所有資料都它大,然後再按此方法,對左右兩邊的資料分別進行快速排序,整個排序過程可以 遞迴進行,以此達到整個陣列變成有序序列。比如我們現在對序列arr 這6個數進行排...
1045 快速排序 25分 解題思路
著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 排列是1 3 2 4 5。則 因此,有 3 個...
快速排序 思路理解
與歸併排序一樣,快速排序也是乙個分治演算法,需要選擇乙個基準 第乙個元素,最後乙個元素,隨機乙個元素 以此基準作為劃分 快速排序的關鍵是劃分partion 每一趟劃分,我們就可以將作為基準值 x 放到排序陣列的正確位置,並且將所有比 x 小的放到 x 的左邊,所有比 x 大的元素放到 x 的右邊。c...