步骤如下:
/**
* 快速排序
*
* @author xjf
* @date 2020/8/28 16:08
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[]{1, 20, 8, 666, 56, 256, 7, 256, 351, 666, 96};
System.out.println("排序前:");
for (int i : arr) {
System.out.print(i + " \t");
}
System.out.println();
quickSort(arr, 0, arr.length -1);
System.out.println("排序后:");
for (int i : arr) {
System.out.print(i + " \t");
}
}
/**
* 快速排序实现方法
*
* @param arr 原始无序数组
* @param low 数组起始索引
* @param high 数组最大索引
*/
private static void quickSort(int[] arr, int low, int high){
if (low < high) {
int i = low;
int j = high;
// 取第一个数为基准数
int x = arr[low];
// 一轮排序需要将元素都遍历一遍
while (i < j) {
// 首先从右往左遍历,直到找到一个比基准数小的位置索引
while (i < j && arr[j] >= x) {
j--;
}
// 将在右边小于基准的数赋值到左边的位置 i 上,初次 i 位置的数就是基准数,被保存在 x 变量上,所以覆盖没问题
if (i < j) {
arr[i++] = arr[j];
}
// 再从左往右遍历,找比基准数大的数
while (i < j && arr[i] < x) {
i++;
}
// 将左边大的数,赋值给右边的位置 j 上,此时 j 这个位置的数已经被赋值到左边去了,所以直接覆盖没问题
if (i < j) {
arr[j--] = arr[i];
}
}
// 上面的外层循环条件为 i < j,所以跳出循环时,i = j。
// 此处这个点的值是被赋值到其他位置上的,所以需要填充这个点的真实值,即为基准值
arr[i] = x;
// 上面执行一次排序后,数据根据基准值分成了两块,再分别对两块进行同样的排序
quickSort(arr, low, i - 1);
quickSort(arr, i + 1, high);
}
}
}