题目 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
来源:力扣(LeetCode)
思想
- 利用快速排序的一次划分思想,第一次划分将值为0的元素放在非0元素之前,并且返回分界下标。将分界下标后的子数组进行划分,将值为1的元素放在非1的元素之前。
- 时间复杂度为O(n),空间复杂度为O(1)
代码
//使用双指针,思想类似于快排中的partition 划分
void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
int part(int flag,int *nums,int low,int high,int numsSize){
while(low<high){
while(low<high&&nums[low]==flag) low++;
swap(&nums[low],&nums[high]);
while(low<high&&nums[high]!=flag) high--;
swap(&nums[high],&nums[low]);
}
//返回调整后 数组中不等于flag元素的第一个下标或最后一个元素的下标
if(low<numsSize&&nums[low]==flag)
return low+1;
return low;
}
void sortColors(int* nums, int numsSize){
if(numsSize==0||numsSize==1)
return ;
int low=0,high=numsSize-1;
//part划分只能划分出两个区间,所以要划分出三种区间,应该进行两次划分
low=part(0,nums,low,high,numsSize);
part(1,nums,low,high,numsSize);
}