/**
* @Author :
* @description 快速排序算法
* @create 2024/3/27 15:27
*/
public class QuickSort {
private int[] arr = new int[]{1,5,3,2,9,8,6,7,0,4};
public QuickSort() {
}
public QuickSort(int[] arr) {
this.arr = arr;
quickSort(arr);
}
public int[] getArr() {
return arr;
}
public void setArr(int[] arr) {
this.arr = arr;
}
/**
* 分区算法
* @param
* @return axis轴的索引
*/
private int partition(int left,int right){
int r = right;
int axis = arr[right];//轴指针(默认取数组最后一个元素)
right-=1;//将右指针指向轴的左边1格
//比轴小的在轴左边,比轴大的在轴右边,轴在正确的位置
while (right>=left){
if (arr[left]<axis){
left++;
}else {
if (arr[right]>axis){
right--;
}else {
swap(left,right);
}
}
}
swap(left,r);
return left;
}
/**
* 交换元素
* @param index1
* @param index2
*/
private void swap(int index1,int index2){
int temp = arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
/**
* 快速排序算法
*/
private void quick(int left,int right){
//基准情形:数组只有不到2个元素,无需分区(因为在轴左边的数组只有一个元素时,一定是有序的)
if (right-left<=0){
return;
}
int index = partition(left,right);
//左分区
quick(0,index-1);
//右分区
quick(index+1,right);
}
/**
* 快速排序算法的封装
* @param arr
* @return
*/
public int[] quickSort(int[] arr){
int left = 0;
int right = arr.length-1;
setArr(arr);
quick(left,right);
return getArr();
}
/**
* 内部测试类
*/
public static class Test{
public static void main(String[] args) {
int[] arr = new int[]{0,1,2,3,4,5,6,7,9,10,8};
//方式1(普通方法调用)
QuickSort obj1 = new QuickSort();
//调用排序算法
int[] ints1 = obj1.quickSort(arr);
for (Integer i :
ints1) {
System.out.println(i);
}
//方式2(有参构造)
QuickSort quickSort = new QuickSort(arr);
int[] ints2 = quickSort.getArr();
for (Integer i :
ints2) {
System.out.println(i);
}
}
}
}