荷兰国旗问题:给定一个数num,将数组中划分成3部分,小于num的部分,等于num的部分,大于num的部分
例题:一个数组只有0,1,2三个数,问遍历一遍怎么完成排序,要求空间复杂度为O(1)
/**
* 将数组分成三个区域,0,1,2,从头开始遍历
* 如果当前数字是2,则和最后面hi交换;
* 如果当前数字是0,则和前面的lo交换;
* 如果当前数字是1,则直接++即可
* @param nums
*/
public static void sort(int[] nums) {
int n = nums.length;
int lo = -1, cur = 0, hi = n - 1;
while (cur < hi) {
if (nums[cur] == 2) {
swap(nums, cur, hi--);
} else if (nums[cur] == 1) {
cur++;
} else {
swap(nums, cur++, ++lo);
}
}
}
public static void swap(int[] nums, int m, int n) {
int tmp = nums[m];
nums[m] = nums[n];
nums[n] = tmp;
}
public static void main(String[] args) {
int[] nums = {2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 0, 0, 2};
sort(nums);
System.out.println(Arrays.toString(nums));
}
网友评论