问题:
Given an array with n objects colored red, white or blue, sort them 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.
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 an one-pass algorithm using only constant space?
保存三个指针:r,w和b。其中r表示最后一个红色之后的一个;w表示第一个未判断的;b表示第一个blue之前的一个。所以:
1. r之前(不包括r)都是红色;
2. r到w之间(包括r,不包括w)都是白色;
3. b之后(不包括b)都是蓝色。
然后通过推进w以及swap,来进行sort。
代码:
class Solution {
public:
void sortColors(int A[], int n) {
int r = 0;
int w = 0;
int b = n - 1;
while (w <= b) {
if (A[w] == 0) // red
swap(A[r ++], A[w ++]);
else if (A[w] == 1) // white
w ++;
else // blue
swap(A[b --], A[w]);
}
}
};