public static void m(int [] arr, int start, int end){
int mid = start + (end - start)/2;
//这里如果不是采用三位取中法,而是直接选取中间的数;会出现问题
//在从j(也就是从右往左的过程),小于基准的值会逐渐替代还未排序的arr[i]的值,覆盖掉了
//进而导致出错
//总结:采用mid这种方式最后i 和j定位的位置 不一定是pivot的位置
//swap(arr,start,mid);
int pivot = arr[mid];// mid 改为start;
int i = start;
int j = end;
while(i<j){//9,8,7,5,42,5,6,66,3,545,5524,6642,2
while(i<j && pivot <= arr[j]){
j --;
}
arr[i] = arr[j];
while(i<j && pivot > arr[i]){
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
m(arr, start, j - 1);
m(arr, j + 1, end);
}
//快排之所以 用两边的值作为基准,是因为排完序后的i 和 j的位置就是基准所在的问题。
//就算是在每一步取mid 然后把start和mid的值进行交换,此时基准变成pivot = arr[start];就可以