1.基本思想
1.1 先从数列中取出一个数作为基准数
1.2 分区过程,将比这个数大的全放在右边,小的放在左边(分区)
1.3 再对左右分区重复第一,二步,直到各区间只有一个数(递归)
2.物理实现
public class QuickSort {
public static void quckSort(int[] array) {
int low = 0;
int high = array.length - 1;
quickSort(array, low, high);
}
private static void quickSort(int[] array, int low, int high) {//???递归何时结束
if (low < high) {
//分区操作,将一个数组分成两个分区,返回分区界限索引
int index = partition(array, low, high);
//对左分区进行快速排序
quickSort(array, low, index - 1);
//对右分区进行快速排序
quickSort(array, index + 1, high);
}
}
private static int partition(int[] array, int low, int high) {
//指定左指针i和右指针j
int i = low;
int j = high;
//将第一个数作为,基准数(挖坑)
int x = array[low];
//使用循环实现分区操作
while (i < j) {
//从右向左移动j,找到第一个小于基准数的值array[j]
while (array[j] >= x && i < j) {
j--;
}
//将右侧找到小于基准数的值加入到左边的坑中,左指针向中间移动一位i++
if (i < j) {
array[i] = array[j];
i++;
}
//从左向右移动i,找到第一个大于等基准数的值array[i]
while (array[i] <= x && i < j) {
i++;
}
//将左侧找到大于基准数的值加入到右边的坑中,右指针向中间移动一位j--
if (i < j) {
array[j] = array[i];
j--;
}
}
//使用基准值填坑,这就是基准值的最终位置
array[i] = x;
//返回基准值的索引
return i;
}
main
public static void main(String[] args) {
//创造一个无序数组
int[] array = {72, 57, 9, 6, 12, 45, 85, 41, 55, 45, 99, 77};
//输出该无序数组
System.out.println(Arrays.toString(array));
//快速排序
quckSort(array);
//输出有序数组
System.out.println(Arrays.toString(array));
}
结果
[72, 57, 9, 6, 12, 45, 85, 41, 55, 45, 99, 77]
[6, 9, 12, 41, 45, 45, 55, 57, 72, 77, 85, 99]