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