二、快速排序

1. 函数主体

public static void quickSort(int[] a,int p, int r){
    if (p < r){
        //partition函数,将数组分割为两部分,a[q]左侧数组元素小于a[q],a[q]右侧数组元素大于a[q]
        int q = partition(a,p,r);
        //左右两侧数组递归调用quickSort
        quickSort(a,p,q-1);
        quickSort(a,q+1,r);
    }
}

第一步,数组a通过partition操作后,有如下性质:

  • 数组被划分成了左右两个部分,两个部分的划分以 a [ q ] a[q] a[q]为界
  • a [ q ] a[q] a[q]左侧的元素均小于 a [ q ] a[q] a[q], a [ q ] a[q] a[q]右侧的元素均大于 a [ q ] a[q] a[q]

第二步,分别对 a [ q ] a[q] a[q]左侧和 a [ q ] a[q] a[q]右侧元素递归进行快速排序。最终,数组以升序排列。

2. partition函数

private static int partition(int[] a, int p, int r){
    int i = p-1;
    
    /**
      * 这个函数的目标是:
      * 将数组的最后一个元素a[r]作为基准数,从而将数组划分为两部分,
      * 左侧部分均小于a[r],右侧部分均大于a[r]
      */
    
    /**
      * 注意,在for循环过程中,位于区间[i+1, j]内的元素
      *	始终大于等于a[r].
      * 当循环结束时,j以抵达数组的右边界。此时将a[r]与a[i+1]替换,
      * 即可实现函数的目标。
	  */
	int k = a[r];
    for(int j = p; j <= r; j++){
        if(a[j] < k){
            i++;
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[r] = a[i+1];
    a[i+1] = k;
    return i+1;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值