以从小到大的顺序进行说明。
前后指针法
是指对于一个数组,定义前后各一个指针(prev 和 cur)
- prev用于卡一个比基准值大的值进行交换
- cur用于向前遍历出比基准值小的,和prev进行交换
图解
- 初始化
- 选出
基准值4
- 如果cur 所在的值比基准值小,那就++prev,看prev是否与 cur 在同一个位置(是一个位置那就还不到交换的时候,说明刚到这个比基准值大的区间,要开始让cur往后走,确定这个大区间有多长了)
- 如果 cur 的值要比4大,需要扩大大区间的范围,但是不++prev,prev就是大区间的起始位置。
再次进行交换
此后都是比基准值大的,只需让cur++>
交换prev 和基准位置(left)的值,完成一次调整
代码
private int partationRearPrev(int[] array, int left, int right) {
int key = array[left];
int prev = left;
int cur = prev + 1;
// 取到等号才能遍历完
while (cur <= right) {
// 先让prev 向前走,但是和cur 没有位置上的距离,那就不换
// 和基准值进行比较
if (array[cur] < array[left]) {
swap(array, cur, prev);
}
cur++;
}
// 将分界线置于中间
swap(array, left, prev);
// prev就是分界线
return prev;
}