快速排序就是随机找一个基准值,然后小于基准值的放在数组的左边,等于基准值的放在数组的中间,大于基准值的放在数组的右边。然后不断的递归,直到全部排好序。时间复杂度为logN*N
具体的图解可以看‘荷兰国旗问题那篇’
package com.yf;
public class Day061 {
public static void quickSort(int[] arr,int L,int R) {
if(L < R) {
int random = L + (int)Math.random()*(R-L+1);//从数组中随机挑选一个位置
swap(arr,random,R);//和最后一个位置的值交换,最后的那个值作为基准值
int[] p = partition(arr,L,R);//排序算法。
quickSort(arr,L,p[0]-1);
quickSort(arr,p[1]+1,R);
}
}
public static int[] partition(int[] arr,int L,int R) {
int p1 = L-1;//小于区域
int p2 = R;//大于区域,不要看R上的值,R上只是一个基准值,没有关系
while(L<p2) {//L前面都是代表未知区域,当未知区域全部被大于区域占领之后,停止循环。
//L值是不停往前推进的,推进到大于区域之后就停止了
if(arr[L]<arr[R]) {
swap(arr,L++,++p1);
}
else if(arr[L] == arr[R]) {
L++;
}
else {
swap(arr,L,--p2);
}
}
swap(arr,R,p2);
return new int[] {p1+1,p2};
}
public static void swap(int[] arr,int a,int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String[] args) {
int[] arr = {1,2,5,4,7,2};
quickSort(arr,0,arr.length-1);
for(int i:arr) {
System.out.println(i);
}
}
}