public static void main(String[] args) {
//给出无序数组
int[] arr={72,6,57,88,96,36,52,4,56};
//打印无序数组
System.out.println(Arrays.toString(arr));
//无序数组排序
quickSort(arr);
//打印有序数组
System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr) {
int low=0;
int high=arr.length-1;
quickSort(low,high,arr);
}
private static void quickSort(int low, int high, int[] arr) {
if(low<high){
//分区
int index=divideArea(low,high,arr);
//先判断if条件,左分区,递归,方法执行完则递归执行下一个递归函数
quickSort(low,index-1,arr);
//右分区,递归
quickSort(index+1,high,arr);
}
}
private static int divideArea(int low, int high, int[] arr) {
//左指针,因为需要有序(从左到右)的移动,所以取下标
int i=low;
//右指针,因为需要有序(从右到左)的移动,所以取下标
int j=high;
//设基准值,即用于分区的中间值,挖坑,将数组的第一个值作为基准值,(**可以取这次分区的平均值**)
int x=arr[i];
//判断什么时候能移动指针,移动指针(视频推荐先移动右指针,*****************先左还是先右,没关系)
while(i<j){
//移动右指针,j--,如果值大于基准值就一直移动,如果小于基准值,while循环会自动停止,还要保证右指针不能小于左指针(arr[j]>=x比较的是数组的值,不受外面while(i<j)的控制了,所以需要添加i<j)
while(arr[j]>=x && i<j){
j--;
}
//当上面的while循环执行完毕,而且i还小于j,则表示,现在i跟j之间有小于基准值的数,需要将其移动到左边(复制并填坑)
if(i<j){
arr[i]=arr[j];//将找到的右分区小于基准值的数值放到i所在的坑中,数组j位置就变成坑了(将j对应的值复制到,坑i中)
i++;//相当于将右分区小于基准值的数值放到i所在的坑中,所以轮到左指针i移动了
}
//如果左指针对应的值小于基准值,移动左指针,同理上一个while
while(arr[i]<x && i<j){
i++;
}
//上面的while循环完,如果i还在j的左边,则表示i与j之间有大于基准值的数值,这是坑在j的位置,将i对应的值放入到j对应的位置
if(i<j){
arr[j]=arr[i];
j--;//相当于将左分区大于基准值的数值放到j所在的坑中,所以轮到右指针j移动了
}
}
//填最后一个坑,因为这时i与j的值相同,将一开始取的基准值放到中间
arr[i]=x;
//返回基准值的位置索引
return i;
}
快速排序_附注释
最新推荐文章于 2024-08-11 20:55:25 发布