快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;快速排序则是当两个数组都有序时,整个数组也自然就有序了。
public static void quickSort(double[] A){quickSortAPI(A, 0, A.length- 1);}private static void quickSortAPI(double[] A, int lo, int hi){if(lo >= hi){//这里可以使用插入排序,降低递归带来的效率下降//判断条件应该是 lo + x >= hireturn;}int pivot = partition(A, lo, hi);quickSortAPI(A, lo, pivot- 1);quickSortAPI(A, pivot+ 1, hi);}private static int partition(double[] A, int lo, int hi){int pivot = lo;int i = lo;int j = hi+ 1;for( ; ; ){//这里的边界条件是i < hi, 如果当i == hi时//在进行下次循环的时候访问的A[hi+1]就会越界while(compareTo(A[++i], A[pivot]) == - 1 && i < hi){}while(compareTo(A[pivot], A[--j]) == - 1 && j > lo){}//这里的边界条件是相同的道理,如果 i == j == hi 时候未跳出//在for循环的第一次while的A[hi+1]就会越界if(i >= j){break;}exchange(A, i, j);}exchange(A, pivot, j);//pivot记得放在正确的位置//A[lo, j-1] <= A[j] <= A[j+1, hi] 成立return j;}