1.题目描述
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。必须在不使用库内置的 sort 函数的情况下解决这个问题。
2.样例描述
3.思路描述
因为颜色用数字代替,要求颜色的顺序正好是代表数字升序,可以直接采用排序算法进行颜色分类。此处,我采用了最简单的冒泡排序。
因为快速排序速度最快,所以顺便学习并使用快排解题。
4.代码展示
冒泡排序
void sortColors(int* nums, int numsSize){
int i=0,j=0;
int tmp;
for(i=0;i<numsSize-1;i++)
{
for(j=0;j<numsSize-1-i;j++)
{
if(nums[j]>nums[j+1])
{
tmp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=tmp;
}
}
}
}
快速排序
void quick(int left,int right,int nums[])
{
int i,j,tmp,k;
if(left>=right)
{
return;
}
tmp = nums[left];
i=left;
j=right;
while(i<j)
{
while(nums[j]>tmp && i<j)
{
j--;
}
while(nums[i]<=tmp && i<j)
{
i++;
}
if(i<j)
{
k=nums[i];
nums[i]=nums[j];
nums[j]=k;
}
}
nums[left] = nums[i];
nums[i]=tmp;
quick(left,i-1,nums);
quick(i+1,right,nums);
}
void sortColors(int* nums, int numsSize){
quick(0,numsSize-1,nums);
}