本题 题目链接
题目描述
我的题解
方法:三路快排
思路分析
- 三路快排的应用+变形一下
- 因为本题最多只有3个数,所以令 v 为2,只进行一次三路快排调用即可
- 下面先给出三路快排的原模版。再给出我本题的代码
- 三路快排的变量情况图:
// 三项切分的快速排序
private static void quick3way(int[] a, int lo, int hi) {
if(hi <= lo)
return;
int lt = lo, i = lo+1, gt = hi;
int v = a[lo];
while(i <= gt) {
if(a[i] < v) {
int tmp = a[i];
a[i++] = a[lt];
a[lt++] = tmp;
} else if(a[i] > v) {
int tmp = a[i];
a[i] = a[gt];
a[gt--] = tmp;
} else i++;
}
quick3way(a, lo, lt-1);
quick3way(a, gt+1, hi);
}
我本题的代码如下
public void sortColors(int[] nums) {
if (nums == null)return;
quick3way(nums,0,nums.length-1);
// System.out.println(Arrays.toString(nums));
}
private void quick3way(int[] nums, int lo, int hi) {
if (hi<=lo) return ;
int lt=lo;
int gt = hi;
int i=lo;
int v = 1;
while (i <= gt) {
if (nums[i] < v) {
if (i == lt) {
lt++;
i++;
} else {
int tmp = nums[i];
nums[i] = nums[lt];
nums[lt++] = tmp;
}
} else if (nums[i] > v) {
int tmp = nums[i];
nums[i] = nums[gt];
nums[gt--] = tmp;
} else i++;
}
}