快速排序(java运行,两头交换法的个人理解记录)
//快排
import java.util.Arrays;
public class work5 {
public static void main(String[] args) {
int[] a={45,23,76,12,37,72,35,65,6};
System.out.println(Arrays.toString(a));
int l=0,r=a.length-1,p=a[0];
sort(a,l,r);
System.out.println(Arrays.toString(a));
}
public static void sort(int[] arr, int left, int right){
if(left > right) //如果left已经在right右边了,那就速速退出方法
return;
int tmp = arr[left]; //设最左边的值是基准
int i = left; //用i,j表示
int j = right;
while(i != j){ //i j不相等时循环
//必须先进行j(右边指针)的查找,顺序不可变
while(arr[j] >= tmp && j > i) //j向左找比tmp小的,如果arr[j]比tmp大,进入循环
j--; //”j--“,j继续向左前进一位
while(arr[i] <= tmp && j > i) //i向右找比tmp大的,如果arr[i]比tmp小,进入循环
i++; //”i++“,i继续向右前进一位
if(j > i){ //当跳出两个while循环,说明i j都已经找到并停下,这个时候,交换arr[i]和arr[j]的值
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//i j相等时跳出循环
arr[left] = arr[i]; //把相遇时的值赋给最左侧,left在循环外定义没有改变,仍是最左侧的值,也就是tmp
//一次大循环结束,重新定义“tmp”
arr[i] = tmp;
sort(arr, left, i-1); //left没变,还代表最左,最右是i-1
sort(arr, i+1, right);
}
}