package per.array.quicksort;
/*
* 算法:快速排序
* 原理:选择轴心值(中间值),按数组从左到右和从右到左的顺序依次遍历,规则为小放左
* 思想:分治递归
* */
public class QuickSort {
//step1-method1:将数组数据分为两部分(partition),左边数据集合<轴心值(一般为arr[0])<右边数据集合
public static int partition(int[] arr, int left, int right) {
int pivotValue = arr[left];
int pivotPointer = left;
while(left < right) {
while(left < right && arr[right] >= pivotValue)
right--;
while(left < right && arr[left] <= pivotValue)
left++;
swap(arr, left, right); //把大的交换到右边,把小的交换到左边。
}
swap(arr, pivotPointer, left); //最后把pivot交换到中间
return left;
}
//step2:分治递归 partition(0,pivotPointer-1)和partition(pivotPointer+1,maxindex)
public static void quickSort(int[] arr, int left, int right) {
if(left >= right)
return ;
//得到轴心位置下标
int pivotPoint = partition(arr, left, right);
//轴心左侧partition
quickSort(arr, left, pivotPoint-1);
//轴心右侧partition
quickSort(arr, pivotPoint+1, right);
}
//step3:实现快速排序
public static void sort(int[] arr) {
if(arr == null || arr.length == 0)
return ;
quickSort(arr, 0, arr.length-1);
}
//preparation:交换数组元素值
public static void swap(int[] arr, int left, int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
复习算法,已忘记出处--谢谢作者