leetcode原题链接:. - 力扣(LeetCode)
思路: 创建两个指针分别找0和2并完成就位操作,利用遍历数组找到2可以缩小遍历右界的遍历范围,
依次遍历完就可得到最后的数组(也可以理解成,先把2排到最后面,这样数组范围就变小了,再次遍历把0排前面,可以合并)
void swap(int*a,int*b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void sortColors(int* nums, int numsSize) {
int *p0=nums;
int *p2=nums+numsSize-1;
int count=numsSize-1;//(也可忽略)记录每一次p2的指向,最后的指向应该是不为2.
for(int i=0;i<=count;i++){//根据每次如果把2遍历到放到后面就可缩小下一次遍历范围设计for循环
if(nums[i]==2){
while(*p2==2&&count>0&&count>i){//找到p2指向不为2处,(排除都是2的数组以及在此次for循环内p2找不为2的数据时候跑到i的左边的情况)
p2--;
count--;
}
if(count>0){//可以交换的符合情况
swap(p2,&nums[i]);
p2--;
count--;
}
}
if(nums[i]==0){
swap(p0,&nums[i]);
p0++;//0的时候不需要p2类型的
}
}
}