public class 快速排序 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int [] a = {2,8,7,1,3,5,6,4};
show(a);
quickSort(a,0,a.length-1);
show(a);
}
public static void show(int []a)
{
for(int i:a)
{
System.out.print(i+" ");
}
System.out.println();
}
public static void quickSort(int []a,int p,int r)
{
if(p<r)
{
int q=partition(a,p,r); //此处将数组分成两部分,一部分比基值小,一部分比基值大
quickSort(a,p,q-1); //对基值小的部分用同样的方式处理,指导只剩一个数据
quickSort(a,q+1,r);//对基值大的部分用同样的方式处理,指导只剩一个数据
}
}
public static int partition(int []a,int p,int r)
{
int x=a[r]; //x是基值,通常选最后一个数据
int i=p-1; //i是指向小于基值的最后一个数据,初始为空,所以是第一个数的前一个
for(int j=p;j<r;j++) //从第一个到倒数第2个数进行排序,最后一个数是基值不用参与,
//j用来指向参与比较的数据,也是大于基值的最后一个数据的后一个位置
{
if(a[j]<=x){ //如果当前数比基值小,则i移动到后面一个位置(也就是当前比基值大的第一个数据的位置),
//并将j指向的数据(也就是比基值小的数据)换到i的位置。
i++;
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//当所有数都归位后,剩下的i+1的位置就是基值的位置,将i+1的数据和r位置的数据进行交换即可。
int t = a[i+1];
a[i+1]=a[r];
a[r] = t;
return i+1; //i+1就是基值的位置,为下一步的划分做准备。
}
}
结果:
2 8 7 1 3 5 6 4
1 2 3 4 5 6 7 8