默认从小到大排序,从大到小类似
1、选取最左端为参考值base,最左端元素arr[i]和最右端元素arr[j]
2、arr[j]向左找比base小的数,直到找到即停止、arr[i]向右找比base大的数,直到找到即停止 。直到相遇之前,都一直找
3、完成第二步后,对调base和找到的arr[i](=arr[j]),原base所在的现在的位置把该数组分成左右两部分
4、递归对左边和右边重复2 3 步
import java.util.Random;
public class Test {
public static void main(String[] args){
int[] arr = {5, 3, 7, 9, 4, 0, 4};
quickSort(arr, 0, arr.length -1);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i]);
}
//如下为创建一定规模的随机数组成的数组,统计排序所花时长
/*
int [] arr = new int[10000000];
Random r = new Random();
for(int i = 0; i< arr.length; i++){
int num = r.nextInt();
arr[i] = num;
}
long start = System.currentTimeMillis();
quickSort(arr, 0, arr.length-1);
long end = System.currentTimeMillis();
System.out.println(end - start);
*/
}
public static void quickSort(int[] arr, int left, int right){
if(left > right) return;
int base = arr[left];//取最左边的值为最小值
int i = left; int j = right;
//arr[j]向左找比base小的数,直到找到即停止
//arr[i]向右找比base大的数,直到找到即停止
//直到相遇之前,都一直找
while (i != j){
while(arr[j] >= base && i < j) j--; //此处的&& i < j是必要的,否则会抛出异常
while(arr[i] <= base && i < j) i++;
//走到这说明找到了并且停止了,交换找到的两个数
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
//讲参考值和找到的那个互换
arr[left] = arr[i]; arr[i] = base;
//递归遍历两边区域——分治
quickSort(arr, left, i - 1 );
quickSort(arr, i + 1, right);
}
}