分治之快速排序

分治之快速排序

分治的基本思想是将问题划分为子问题,递归的进行求解子问题,最后组合起来。

套公式:

  • 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;
  }
}


你可能感兴趣的:(算法导论)