题目二、颜色分类(用指针解决) 给定一个包含红色、白色和蓝色,共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按红色、白色、蓝色顺序排列。0、1、2分别表示红白蓝。不能使用库函数。 示例: 输入:[2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
时间: 2024-10-28 19:11:09 浏览: 13
给你一个包含n个整数的数组nums,并检查nums中是否有三个元素a、b和c使a+b+c=0?请查找总和为0且不重复的所有
题目二要求对颜色数组进行排序,同时保持同色元素相邻并按红白蓝顺序。我们可以使用双指针法,一种常用的原地排序策略。这里可以利用三个指针,一个指向当前处理的位置,另一个用于查找下一个需要移动的元素,最后一个标记边界。
以下是使用指针的一个解决方案:
```c
#include <stdio.h>
void sortColors(int nums[], int n) {
if (n <= 1) return; // 如果数组长度小于等于1,无需排序
int* i = nums, *j = nums + 1, *end = nums + n;
while (j < end) { // 当j未超过数组末尾
if (*i++ != 0) continue; // 如果第一个元素不是红色,跳过
while (j < end && *j != 0) j++; // 寻找第一个红色元素,移到其位置
while (i < j) { // 将所有白色元素移到红色元素之前
if (*i != 1) break; // 如果遇到非白色元素,结束移动
swap(&*i, &*(--j)); // 交换i和j指向的元素
}
while (i < j && *j != 2) j++; // 寻找第一个蓝色元素,移到其位置
while (i < j) { // 将所有白色元素移到蓝色元素之前
if (*i != 1) break; // 如果遇到非白色元素,结束移动
swap(&*i, &*(--j)); // 交换i和j指向的元素
}
i++; // 移动红色元素到下一组
}
}
// 交换两个整数的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int nums[] = {2, 0, 2, 1, 1, 0};
int n = sizeof(nums) / sizeof(nums[0]);
sortColors(nums, n);
for (int i = 0; i < n; i++) {
printf("%d ", nums[i]);
}
return 0;
}
```
运行上面的代码,你会得到期望的结果:[0, 0, 1, 1, 2, 2]。
阅读全文