快速排序采用分治法,理解起来很简单,选取一个中心轴,比中心轴值小的忘左边放,比中心轴大的值往右边放,这样执行一次就将一个数组分割为两个数组,然后分别的对这两个数组进行上诉操作,以此类推,直到数组元素只有一个的时候排序结束。

现在选取一个数字作为中心点,这里选择最左边的数字作为中心轴也就是20。这时候从右往左找一个比20小的数字,这样找过来是4,将4填充到数组的0号位,然后在从左往右找一个比20大的数字,就是42,将数值填充到原本4所在的位置也就是下标为2的位置。步骤如下图所示
1、选取中心轴 20

2、从右往左找一个比20小的值并将20所在的位置替换,这样就找到了4

3、从左往右找一个比20大的数字,并且将原本4所在的位置替换,也就是下标为2的位置

4、这个时候接着从右往左找一个比20小的数字,这时右边的指针在数组的2号位,在往左就是当前左边指针的位置,这个时候左右指针位置相遇,将20填充到相遇的的位置。这个相遇的位置往往都是如上图所示的空白位,原因就是每当一个指针移动的时候另一个指针总是静止不动的,那么也就是说这个静止不动的指针一定是一个空白位(或是已经将数值交换的位置或是初始状态的中心轴的位置),这个时候将中心轴的值填充的这个空白位置就完成了一次排序

这个时候以中心轴为界,左边的都比20小,右边的都比20大。这时候分别将中心轴两边的数组分别进行以上步骤即可。
其实也不难发现,上诉4步完成后,中心轴所在的位置也是他最终排序所在的位置。
代码如下:
public void quick_sort() {
m(arrays, 0, arrays.length - 1);
System.out.println(Arrays.toString(arrays));
}
//排序
public void m(int[] arrays, int l, int r) {
//递归的出口。
if (l >= r) return;
//以中心轴为界,小的值往轴的左边放,大的值往右边的放,最终返回的是左右两个指针相遇的位置,换句话说就是中心轴最终所在的位置,以此为界分别重复本方法中的步骤,就是递归
int p = n(arrays, l, r);
//左边数组递归
m(arrays, l, p - 1);
//右边数组递归
m(arrays, p + 1, r);
}
public int n(int[] arrays, int l, int r) {
//i代表左边的边界,j代表右边的边界,x就是中心轴,也可以叫做临时变量,用来保存中心轴的值。
int i, j, x;
i = l;
j = r;
x = arrays[i];
//该循环保证了在i=j之前可以一直继续
while (i < j) {
//从右往左
while (arrays[j] > x && i < j) {
j--;
}
arrays[i] = arrays[j];
//从左往右
while (arrays[i] <= x && i < j) {
i++;
}
arrays[j] = arrays[i];
}
arrays[i] = x;
return i;
}