快排的主要思想还是在递归上面。第一步先来了解一下快排的子公式是什么:
1、现在有一个数组,快排主要做的就是对数组进行一次调节数据顺序,在数组中找最后一个数(或者随机一个数)n,将数组内数据的顺序变成n的左边全部是比n小的数,n的右面全部是比n大的数。
2、具体操作:设最后一个数为R,第一个数为L,
当L开始与进行对比,那么就会有3种情况:该数比R大,比R小,等于R。
当L比R大时,我们知道此时的L应该放在最右面,所以让最右面的数与L进行交换,此时的L指向的是被交换过来的数,那么应该再次比较。
当L比R小时
我们可以不进行操作,让L指向下一个数,但是我们希望一次快排后左面全部是比R小的数,而不能存在和R相等的数,因此我们在这里加了一步操作,增加一个指针less,初始值为L-1,然后执行交换操作位置是++less,L++。举个例子
那么L=R时我们就只执行L++就可以了
public static void quickSort(int[] arr) {
if (arr==null || arr.length ==2) {
return;
}
doQuickSort(arr,0,arr.length-1);
}
public static void doQuickSort(int[] arr, int l ,int r){
if (l<r) {
int[] p = position(arr,l,r);
doQuickSort(arr,l,p[0]-1);
doQuickSort(arr,p[1]+1,r);
}
}
public static int[] position(int[] arr,int l ,int r){
int less = l-1;
int more = r;
while (l<more) {
if (arr[l] < arr[r]) {
swap(arr,++less,l++);
}else if (arr[l] > arr[r]){
swap(arr,--more,l);
}else l++;
}
swap(arr,r,l);
return new int[] {
less,
more
};
}