分而治之
一种不断把大问题缩小,直至问题达到最小能解决
解决思路
- 寻找基线条件。问题最小,最能方便解决问题的条件
- 不断把问题缩小,不断接近基线条件。
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
使用 分而治之