思路:在待排序区间中找到一个基准值,然后以基准值为中心,将整个待排序区间整理成三个部分,基准值左边都是小于它的,基准值右边都是大于它的,最后再去递归处理左侧的区间,递归处理右侧的区间。
示例代码:
public class QuikeSort {//快速排序
public static void main(String[] args) {
int[] arr = {9,5,2,7,3,6,8,10,-1,4};
quikesort(arr);
System.out.println((Arrays.toString(arr)));
}
public static void quikesort(int[] arr){
quikesorthelper(arr,0,arr.length-1);//辅助完成递归过程,从0开始,到数组尾部
}
private static void quikesorthelper(int[] arr,int left,int right) {
if(left>=right){//此时代表当前数组里面有0个或一个元素的时候,就不用再排序了
return;
}
//此时再针对left和right这个区间进行排序,方法的返回值就是left和right的重合值
//,知到了这个位置才能进一步进行递归。
int index = partation(arr,left,right);
//再针对重合位置的左侧进行递归排序,也就是0——index-1这段区间,
quikesorthelper(arr,left,index-1);
//再针对重合位置的右侧进行递归排序,也就是index+1——arr.length-1这段区间
quikesorthelper(arr,index+1,right);
}
private static int partation(int[] arr, int left, int right) {
int i = left;
int j = right;
int base = arr[right];//base代表基准值元素
while(i<j){//当i<j的时候找的过程就找完了
while(i<j&&arr[i]<=base){
i++;
}
//当这个循环结束的时候,i要么和j是重合的,要么指向的是比base大的元素
while(i<j&&arr[j]>=base){//这里如果不取等于的话会把基准值也换走。
j--;
}
//这个循环结束的时候,同样j要么和i重合,要么找到了比base小的元素。
swap(arr,i,j);//此时交换i,j对应的元素。
}
//这个大循环结束的时候,代表i和j此时相遇了
swap(arr,i,right);//此时要把重合位置的元素和基准值进行交换
return i;
}
public static void swap(int[] arr,int i,int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
注:
1.常见的基准值一般可以取最左侧和最右侧的元素
2.如果以最左侧为基准值的话,就需要先从右往左找,再从左往右,因为这样才能保证left和right重合的时候指向的元素小于基准值,和基准值进行互换的时候才不会打乱顺序