package cyz;
import java.util.Arrays;
//快速排序
public class Quick_sort {
public static void main(String[] args){
int [] arr=new int []{4,3,2,5,6,1};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
/**
* 首先我们列举6个数-->4,3,2,5,6,1
* 一开始我们设置一个基准数,一般情况下是对数组的第一个当成基准数;通过基准数将比基准数大的放在右边 比基准数小的放在左边
*
*
*
* 基准数------当前数列
* 4 4, 3, 2, 5, 6, 1 low从数组下标为0的时候开始,high从数组的下标为arr.length-1开始
* | |
* low1 high1 先从high位开始,如果high位指向的数字比基准数小就将high位的数字进行copy放在low位指向的数字,接着low位向后移动,high位保持不变
* 第一次 4 1, 3, 2, 5, 6, 1
* | |
* low1 high1 从low开始,如果low位指向的数字小于基准数则向后移动,high位不变
* 第二次 4 1, 3, 2, 5, 6, 1
* | |
* low1 high1 从low开始,如果low位指向的数字小于基准数则向后移动,high位不变
* 第三次 4 1, 3, 2, 5, 6, 5
* | |
* low1 high1 从low开始,如果low位指向的数字比基准数大就将low位的数字进行copy放在high位指向的数字,接着high位向前移动,low位保持不变
* 第四次 4 1, 3, 2, 4, 6, 5
* ||
* low1 high1 从high开始,如果high位指向的数字比基准数大就向前移动,low位保持不变,如果low位和high的数相等时,将基准数粘贴到当前的low位和high位一起数字
*
* 就这样把在1,3,2,4,6,5 分为1,3,2,4 一个区域,6,5为另一个区域
* 1,3,2,4区域 low2从数组下标为0的时候开始,high2从数组的下标为之前的low1开始
* | |
* low2 high2
* 6 , 5区域
* | |
* low3 high3 low3从数组下标为low1+1的时候开始,high3从数组的下标为之前的arr.length-1开始
*
*
* 因此对于每个区域,我们同样运用上述的方法即可
*
*
*
* @author cyz
*/
}
public static void quickSort(int [] arr,int start,int end){
if(start<end){
int stard=arr[start];//获取基准值
int low=start;
int high=end;
while(low<high){
//如果右边的数比基准数大的话
while(low<high&&stard<=arr[high]){
high--;
}
//如果右边的数小于基准数的话
if(arr[high]<stard){
arr[low]=arr[high];
}
//如果左边的数比基准数小的话
while(low<high&&arr[low]<=stard){
low++;
}
//如果左边的数大于基准数的话
if(arr[low]>stard){
arr[high]=arr[low];
}
}
if(low==high){//如果low位和high位都在一起的时候
arr[low]=stard;
quickSort(arr, start, low);//比基准数的区域小于或者等于的数据进行排序
quickSort(arr, low+1, end);//比基准数的区域大于的数据进行排序
}
}
}
}