分治之快速排序
分治的基本思想是将问题划分为子问题,递归的进行求解子问题,最后组合起来。
套公式:
-
Divide
划分子问题:选取基准,找到基准的正确位置,left<=pivot right >= pivot,
-
Conquer
基准划分左右两个子问题,两个子问题进行递归quicksort, (left, pivot) (pivot+1, right)
-
Composite:
组合
public class Sort {
public static void quickSort(int[] arr, int left , int right){
if(left < right) {
int pivotNewIndex = quickSortPartition(arr, left, right, arr[left]);
// pivotNewIndex 已经在合适的位置上了,不需要再排序
// 闭区间 < pivotNewIndex
quickSort(arr, left, pivotNewIndex);
// 开区间 >= pivotNewIndex + 1
quickSort(arr, pivotNewIndex + 1, right);
}
}
public static int quickSortPartition(int[] arr, int p, int q, int pivot){
// j 用来记录最后一个 <= pivot 的
// 当遍历完之后,j 就是 pivot 应该在的位置,用于子问题的分割
// 如何维护这个 j 呢?
// 当然是每次交换前 +1, 即可保证 j 所在的位置是最后一个满足 <= pivot 的
int j = p;
for (int i = p+1; i < q; i++) {
// swap
if (arr[i] < pivot && i!= j) {
j++;
swap(arr, i, j);
}
}
swap(arr, p, j);
return j;
}
public static void swap(int[] arr, int index1, int index2){
int j = arr[index1];
arr[index1] = arr[index2];
arr[index2] = j;
}
}