package 排序;
/**
* 思想:partition部分是从第二个元素开始作为左指针与第一个元素(主元)进行比较
* 如果左指针对应的元素小于等于主元,那么左指针继续向右移动,直到左指针对应的元素大于主元
* 轮到右指针进行扫描,如果右指针对应的元素比主元大,那么右指针向左移动,
* 直至主元大于右指针对应的元素,那么右指针停止移动
* 当左指针判断完了右指针判断完了 又没有超出边界范围,
* 那么左右指针对应的元素进行交换
*
* 当跳出left<=right不成立的时候,
* 右边指针对应的元素总是小于主元的
* 所以右指针对应的元素和主元交换
*
* 注意边界条件
* @author Ad
*
*/
public class 快排双向扫描排序 {
public static void main(String[] args) {
int arr[]={9,5,17,3,2,1,5};
int p=0;
int r=arr.length-1;
quicksort(arr,p,r);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
private static void quicksort(int arr[],int p,int r){
if(p<r){
int q=partition(arr,p,r);
quicksort(arr,0,q-1);
quicksort(arr,q+1,r);
}
}
private static int partition(int[] arr, int p, int r) {
int left=p+1; //左侧指针
int right=r; //右侧指针
int pivot=arr[p]; //主元
while(left<=right){ //边界是right>left
while (left<=right&&arr[left]<=pivot) { //left<=right是防止极端条件下 防止left>right
left++; //如果左指针小于或等于主元,那么左指针向右边移动
}
while(left<=right&&arr[right]>pivot){ left<=right是防止极端条件下 防止right<0
right--; //如果右指针大于主元,那么右指针向左边移动
}
if (left<right) { //在没有违反第一个while循环的情况下 左边和右边指针对应的元素进行交换
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println("");
}
//这是已经超出了边界条件 右指针对应的元素和第一个元素进行交换
int temp=arr[right];
arr[right]=arr[p];
arr[p]=temp;
return right;
}
}