75. Sort Colors
Medium
1715160FavoriteShare
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library's sort function for this problem.
Example:
Input: [2,0,2,1,1,0] Output: [0,0,1,1,2,2]
Follow up:
- A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. - Could you come up with a one-pass algorithm using only constant space?
Accepted
329,446
Submissions
774,807
三色旗: 被编译器的runtime error折磨的不行。
#include <stdio.h>
#include <stdlib.h>
/* 0 1 2 */
void swap(int *p1,int *p2){
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//{0,1,2,0,0,2,2,1}
void sortColors(int* nums, int numsSize){
numsSize = numsSize-1;
int i = 0;
int j = 0;
while(nums[j]==0){
i++;
j++;
/* runtime error */
if(j>=numsSize){
break;
}
}
while(nums[numsSize]==2){
numsSize--;
/* runtime error */
if(numsSize<0){
break;
}
}
/* 只要满足j<=numsSize则认为循环没有结束 */
while(j<numsSize){
// /* 之前的写法,没有考虑本身最后一个数为2,前面数也为2,出现重复替换的情况 */
// while(nums[j]==2){
// swap(nums+j, nums+numsSize);
// numsSize--;
// }
/* 这个地方的判断,防止最后一个结尾也为2的情况 */
if(nums[j]==2){
swap(nums+j, nums+numsSize);
numsSize--;
while(nums[numsSize]==2){
numsSize--;
}
}
while(nums[j]==1){
j++;
/* runtime error */
if(j>=numsSize){
break;
}
}
while(nums[j]==0){
swap(nums+i,nums+j);
i++;
j++;
/* runtime error */
if(j>numsSize || i>numsSize){
break;
}
}
}
}
int main(){
int a5[] = {0,1,0,2,0,2,0,1,2,1,0,0,0,1,0,2,2,0,2,0,0,2,2,2,1,0,1,1};
int a2[] = {0};
int a3[] = {0,0};
int a4[] = {1,1};
int a1[] = {0,1,2,0,0,2,2,1};
int length = sizeof (a1)/sizeof (int);
printf("The length = %d\n",length);
for(int i=0;i<length;i++){
printf("%3d",a1[i]);
}
printf("\n -----final after-----\n");
sortColors(a1,length);
for(int i=0;i<length;i++){
printf("%3d",a1[i]);
}
system("pause");
return 0;
}