分治法以及快速排序
阿新 • • 發佈:2019-01-13
分治法
分治法(divide and conquer,D&C):將原問題劃分成若干個規模較小而結構與原問題一致的子問題 ;遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。
容易確定執行時間,是分治演算法的優點之一。
分支模式在每一層遞迴上都有三個步驟:
--分解(Divide):將原問題分解為一系列子問題;
--解決(Conquer):遞迴地解各子問題。若子問題足夠小,則直接有解;
--合併(Combine):將子問題的結果合併成原問題的解。
分治法的關鍵點:
原問題可以一直分解為形式相同子問題,當子問題規模較小時,可自然求解,如一個元素本身有序
子問題的解通過合併可以得到原問題的解
子問題的分解以及解的合併一定是比較簡單的,否則分解和合並所花的時間可能超出暴力解法,得不償失
快速排序演算法
1、分解:陣列A[p..r]]被劃分成兩個子陣列A[p..q-1]和A[q+1,r],使得A[q]為大小居中的一個數,左側A[p..q-1]中的每一個元素都小於等於它,而右側A[q+1,r]中的每個元素都大於等於它。其中計算下標q也是劃分過程的一部分。
2、解決:通過遞迴呼叫快速排序,對子陣列A[p..q-1]和A[q+1,r]進行排序
3、合併:因為子陣列都是原址排序的,所以不需要合併,陣列A[p..r]已經有序
所以劃分非常重要,具體一些劃分方法以及優化在下一篇部落格介紹。