快速排序:先选取数组中的一个数作为基准值,然后将数组中大于基准值的放在它的右边,将数组中小于基准值的放在它的左边,此时基准值就在数组的中间位置;然后分别对基准值左边和基准值右边的值分别执行上述操作,以达到数组有序。
package com.mrz.test;
/*
* 2022-03-21
* mrz
* 快速排序
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = {6,9,5,7,4};
Quick(arr, 0, arr.length-1);
for(int i = 0;i < arr.length;i++) {
System.out.println(arr[i]);
}
}
public static void Quick(int[] arr,int L,int R) {
if(L>=R)
return ;
int left=L,right=R;
int pivot = arr[left]; //设置中心轴
while(left<right) { //条件:下标值左边比右边小,否则结束循环(因为如果左边不小于右边则说明排序已经结束)
while(left<right&&arr[right]>=pivot) { //左下标小于右边下标,数组右侧下标值大于等于中心轴,则右侧下标自减
right--;
}
if(left<right) { //这里其实不需要太关注判断条件,代码按顺序执行,这里相当于不满足上面的while循环后的执行代码
arr[left]=arr[right]; //说明右侧的值比中心轴小,将右侧下标为right的值赋给左下标,实现比中心轴小的数都放在中心轴的左边
}
while(left<right&&arr[left]<=pivot) { //如果左下标小于右下标,并且数组左下标的值小于等于中心轴,则左下标自增,相当于左下标向右移动一位
left++;
}
if(left<right) { //这里其实不需要太关注判断条件,代码按顺序执行,这里相当于不满足上面的while循环后的执行代码
arr[right]=arr[left]; //说明左侧的值比中心轴大,将左侧下标为left的值赋给右下标,实现比中心轴大的数都放在中心轴的右边
}
if(left>=right) { //如果左下标大于等于右下标,则说明排序结束,也就是已经把中心轴分好了,左边是小于中心轴的值,右边是大于中心轴的值
arr[left]=pivot; //将中心轴赋值给左下标(或右下边)位置
}
}
Quick(arr,L,right-1); //用递归分别对左侧值进行排序,需要注意的是别把这里的两个方法写到上面的while循环里面了
Quick(arr, right+1, R); //用递归对右侧值进行排序
}
}
如果还是不懂可以私信我或者看下下面的视频,个人觉得比较容易理解