分治算法思想將大問題分爲小問題,從而解決小問題,最後將結果合併。分治算法通常有三個過程:分,治,合。分對應分拆大問題,治解決小問題,合將小問題答案合併起來得出最後答案。典型的分治策略有二分,快排和歸併排序。每種算法側重點不同,快排側重於分,沒有明顯的合,而歸併側重於治和合,分很簡單。
快速排序模板:算法
public void qucikSort(int[] array, int left, int right) { if (left >= right) return; int pivot = partition(array, left, right); //分,分的過程當中已經治了 qucikSort(array, left, pivot - 1); qucikSort(array, pivot+1, right); }
歸併排序模板:數組
public void mergeSort(int[] array, int left, int right) { if (left >= right) return; int middle = (left + right) / 2; mergeSort(array, left, middle);//分 mergeSort(array, middle + 1, right);//分 merge(array, left, middle, right);//治和合 }
觀察上面代碼分析可得:
快速排序是先將數組分爲以pivot爲元素左面小於pivot,右面大於等於pivot的兩個序列,而遞歸的是qucikSort。說明在快排分治策略是以「分」爲側重點,沒有明顯的「合」過程。而歸併排序先遞歸將數組分爲左右子序列,在最後進行結果的「合」,歸併排序的分支策略是以「治」,「合」爲側重點,而「分」很簡單。ide