分而治之
一種不斷把大問題縮小,直至問題達到最小能解決
解決思路
- 尋找基線條件。問題最小,最能方便解決問題的條件
- 不斷把問題縮小,不斷接近基線條件。
ps:分而治之算法一般能使用遞歸進行實現
快速排序算法
快速排序算法是一種使用分而治之策略解決的算法
第一步:尋找基線條件
當排序的元素個數爲 0或1的時候,排序會變得很簡單,不需要進行排序就已經是排好順序的數組。因此選定基線條件爲 排序元素個數爲 0或1
- 僞代碼
public int[] quickSort(int[] intArray) {
if (intArray.length <= 1) {
return intArray;
}
else {
// 縮小問題接近基線條件
}
}
第二步:縮小解決的問題,逼近基線條件
逼近基線條件是數組不斷的減少,而且我們的目的是進行數組的排序。因此有人想到了排序的數組是由多個已經排好順序的數組組成,怎麼把這些已經排好序的數組連在一起,於是想出了基準點,(從大到小排序)比基準點小的排在右邊,大的排到座標。快速排序的思路如下:
- 隨機找一個基準點
- 按基準點把大數組分爲小數組,左大右小
- 利用 左大右小 的數組重複步驟 1。直至達到基線條件: 數組元素爲空或1
Java實現代碼
public Integer[] quickSort(Integer[] intArray) {
if (intArray.length <= 1) {
return intArray;
}
else {
// 縮小問題接近基線條件
int baseNumber = intArray[0];
ArrayList<Integer> greaterArrList = new ArrayList<Integer>();
int greatNum = 0, lessNum = 0;
ArrayList<Integer> lessArrList = new ArrayList<Integer>();
for (int i=1; i<intArray.length; i++) {
int ele = intArray[i];
if (ele > baseNumber) {
greaterArrList.add(ele);
greatNum++;
}
else {
lessArrList.add(ele);
lessNum++;
}
}
// return quickSort(greaterArr) + [baseNumber] + quickSort(lessArr)
Integer[] greaterArr = new Integer[greatNum];
Integer[] lessArr = new Integer[lessNum];
greaterArr = greaterArrList.toArray(greaterArr);
lessArr = lessArrList.toArray(lessArr);
Integer[] sortArr = new Integer[intArray.length];
Integer[] greaterSort = quickSort(greaterArr);
Integer[] lessSort = quickSort(lessArr);
for (int i = 0; i < greaterSort.length; i++) {
sortArr[i] = greaterSort[i];
}
sortArr[greatNum] = baseNumber;
for (int i = 0; i < lessSort.length; i++) {
sortArr[greatNum + 1 + i] = lessSort[i];
}
return sortArr;
}
拓展:求和 Sum(n) = 1+2+3+4+....+n
使用 分而治之