快速排序算法可以分为三个步骤:
1.选取中心点 q[l],q[(l+r)/2],q[r]
2.划分区域,根据选取的中心点将数组划分成两部分(左边全小于中心点,右边大于中心点)
3.递归这两部分
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int []q= new int[n];
for(int i = 0;i<n;i++){
q[i] = sc.nextInt();
}
quick_sort(q,0,n-1);//快排
for(int i=0;i<n;i++){
System.out.print(q[i]+" ");
}
}
public static void quick_sort(int q[],int l,int r){
if(l>=r) return;
int x = q[l],i=l-1,j= r+1;
while(i<j){
do i++; while(q[i]<x); //左区间的点严格小于x
do j--; while(q[j]>x); //右区间的点严格大于x
if(i<j){
int temp = q[i];
q[i] = q[j];
q[j] = temp; // 交换两个数
}
}
/*索引j左侧的数字都是小于等于x,包括q[j]。索引j右侧的数字都是大于等于x,不包括q[j]
故区间分为[l,j]和[j+1,r]*/
quick_sort(q,l,j);//递归快排左区间
quick_sort(q,j+1,r);//递归快排右区间
}
}
核心代码及模板:
public static void quick_sort(int q[],int l,int r){
if(l>=r) return;
int x = q[l],i=l-1,j= r+1;
while(i<j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j){
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);