基本思路:
1.将数组的第一作为基准数 stone 。
2.以 stone 进行分组,左边要小于或等于 stone ; 右边大于或等于 stone ;
例:[12, 21, 3, 5, 2, 18] 以 12 为 stone low = 0 ; hi = array.length-1;
分组过程:
记录 stone index
int oldIndex = low;
hi 开始向前找比 stone 大的的数(hi 找大最后大的全移右边),循环找 比 low< hi,由右向左找 stone 值 和rray[hi]比较,找不到hi- -找到,退出循环;
从数组的首元素 low 开始向后找比 stone 的数(low 找小,小的最后全移左边),循环找low <hi,由左向右,low++ 找到,退出循环;
找到后然后两者交换(swap),
再循环,直到 low<hi终止;最后判断,if(low==hi) 移 stone 到正确位置,完成分组,以stone 划分 左边小,右边大;
记下当前 divideIndex ;
3.再对左组小值组,递归 hi = divideIndex -1; 右值组 递归 low = divideIndex +1,直到各区间只有一个数。