荷兰国旗问题
问题描述:给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
类型:排序
思路:三指针
算法实现:
class Solution {
public void sortColors(int[] nums) {
int lt = 0;
int gt = nums.length - 1;
int i = 0;
while (i <= gt) {
if (nums[i] < 1) {
exch(nums, i++, lt++);
} else if (nums[i] > 1) {
exch(nums, i, gt--);
} else {
i++;
}
}
}
private void exch(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
相关算法:
- 快速排序
- 三向单词查找树
应用场景:对存在大量重复元素的数组进行排序,通过切分函数将元素分成三大组 -- 小于切分元素、等于切分元素、大于切分元素,并递归此过程直到排序完成。