二、快速排序

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

你可能感兴趣的:(数据结构与算法)