分治之快速排序

分治之快速排序

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

套公式:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值