递归版
每一次快速排序都是确定一个元素的位置,然后对左右两边的区域做相同过程,直到左边大于等于右边界。
一次快速排序就是以左边界的值为中心,小于它的交换到左边,大于它的交换到右边。
class Solution {
public void sortColors(int[] nums) {
process(nums,0,nums.length-1);
}
public void process(int[] nums, int left, int right){
if(left >= right){
return ;
}
int l = left;
int r = right;
int tmp = nums[left];
while(left != right){
while(nums[right] >= tmp && right > left){//从右边开始比较。
right--;
}
while(nums[left] <= tmp && right > left){
left++;
}
if(right > left){
int exchange = nums[right];
nums[right] = nums[left];
nums[left] = exchange;
}
}
//最后i,j相遇的元素一定是小于等于nums[left]的,因为相遇只有两种可能,
//要么j一路遇到的数字大于等于nums[left]直到碰到i,
//要么j遇到小于nums[left]的元素,然后i一路遇到的都是小于等于nums[left]的元素。
//不论是上述哪种情况最终相遇的结点都是小于等于nums[left]的。
nums[l] = nums[left];
nums[left] = tmp;
process(nums,l,left-1);
process(nums,left+1,r);
}
}