1. 程式人生 > >分治法以及快速排序

分治法以及快速排序

分治法

  分治法(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]已經有序


  所以劃分非常重要,具體一些劃分方法以及優化在下一篇部落格介紹。