上面图是一开始的23为基准一直开始比较的。当low=high时就是确定是它最终的位置
(图是借来的)
public class QuickSortTwo {
/*
* 归并排序是把数组拆到最小单元,然后从最小单元合并。变为有序数组
* 快速排序是把数组从整体开始排序,到最小单元有序,最终达到有序数组
*
* 每轮比较完最终都会确定临时变量的索引位置。
* 1.定义临时变量放置一个基准元素,头索引为L,尾索引为R。
*
* 定义基准元素是索引是从 L 开始的
*
* 2.从 R 向前和临时变量比较,如果遇到大于临时变量 R 就减1向前移动再进行比较。
*
* 3.当遇到小于临时变量,把该 R 对应的元素给到 L 对应的索引位置上
*
* 4.然后改由从 L 开始 向前和 临时 变量比较 ,如果遇到小于临时变量的 L 就 加1 向前移动再进行比较
*
* 5.当遇到大于临时变量,把该 L 对应的元素给到 R 对应的索引位置上
*
* 6.再执行上面的第二步 直到 L < R
*
* 7.确定临时变的即基准元素的索引位置
*
* 8.并返回下轮迭代的索引位置
*
* 9.quickSort分成左右执行到最小单元就退出递归,排序完成
* */
public static void main(String[] args) {
int[] arr = { 49, 38, 65, 97};
quickSort(arr, 0, arr.length - 1);
System.out.println("===============排序后:"+ Arrays.toString(arr));
}
public static void quickSort(int [] arr,int L ,int R){
if (L< R){
//1.先整体
int index = sort(arr, L, R);
//2.左边部分
quickSort(arr, L, index-1);
//3.右边部分
quickSort(arr,index+1,R);
}
}
public static int sort(int [] arr,int L ,int R){
int temp = arr[L];
while (L<R){
//如果为L<=R,等号会使LR重合时,不能和临时变量比较
while (L<R && temp<arr[R]){
R --;
}
arr[L] = arr[R];
while (L<R && temp>arr[L]){
L ++;
}
arr[R] = arr[L];
}
arr[L] = temp;
return L ;
}
}