package algorithm;
import java.util.Arrays;
public class QuickSort02 {
//快速排序,从数组中选定一个值,将其他小于这个值的元素置于前,否则置于后,依此类推
public static void main(String[] args) {
int [] arr={98,1,5,71,46,-1,-67,789,15,64,39,71,46,1};
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int []arr,int left,int right){
int l=left,r=right,mid=arr[(l+r)/2];
/* mid=(l+r)/2,arr[mid] 这里不能标记mid的索引,然后从数组中按索引取元素,因为在遍历循环的时候数组元素顺序是在变化的,
* (l+r)/2处的元素会变化 ,所以应该直接将这个值取出来;
*/
while(l<r){
//找到左边第一个大于或等于arr[mid]的元素
while(arr[l]<mid){
l+=1;
}
//找到右边倒数第一个小于或等于arr[mid]的元素
while(arr[r]>mid){
r-=1;
}
//判断找到的左右元素是否在mid的两边
if(l>=r) break;
//确认在两边就开始进行交换
int temp=0;
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//因为存在找到的交换元素是等于arr[mid]的情况,所以要进行处理
if(arr[l]==mid) r-=1;
if(arr[r]==mid) l+=1;
}
//跳出循环的时候就是l==r;这个时候要处理,让他们交错而过,为递归做准备
if(l==r) {
l+=1;
r-=1;
}
//开始递归
//将第一次排序后的前后数组进行排序;
if(left<r) quickSort(arr, left, r);
if(l<right) quickSort(arr,l, right);
}
}