题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例及提示
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:
输入:nums = [0]
输出:[0]
示例 4:
输入:nums = [1]
输出:[1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码(C语言)
#include<stdio.h>
void sortColors(int* nums, int numsSize){
int left=0;
int right=numsSize-1;
int temp;
int i;
for(i=0;i<=right;i++){
if(nums[left]==0){
left++;
}
if(nums[right]==2){
right--;
}
if(left>=right){
break;
}
if(i<=left){
i=left;
}
if(i>=right){
i=right;
}
if(nums[i]==0){
temp=nums[i];
nums[i]=nums[left];
nums[left]=temp;
left++;
i--;
}
else if(nums[i]==2){
temp=nums[i];
nums[i]=nums[right];
nums[right]=temp;
right--;
i--;
}
}
}
int main(){
int nums[]={1,0,1,1,1,1,0,2,2,1,0,0,0,1,2,2,1,2,1,0,0,2,2,2,0,1,2,0,1,2,2,2,2,0,2,2,2,2,1,2,1,0,0,2,1,0,1,0,0,0,1,1,0,1,1};
int m=sizeof(nums)/sizeof(nums[0]);
sortColors(nums, m);
for(int i=0;i<m;i++){
printf("%d ",nums[i]);
}
}
双指针,注意处理交换后的边界元素
解读
单指针两遍循环
双指针一遍循环