Leetcode: Sort Colors
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?
1 class Solution { 2 public: 3 void sortColors(int A[], int n) { 4 int red = 0, blue = n - 1; 5 6 for(int i = 0; i < blue +1;){//i < blue + 1 because the elements after blue are all 2 7 if(A[i] == 0) 8 swap(A[i++], A[red++]);//only 1 can be in A[red] 9 else if(A[i] == 2) 10 swap(A[i], A[blue--]);//0 or 1 can be in A[blue] 11 else i++; 12 } 13 } 14 };
2. 利用快速排序中的partition算法。先将0作为pivot将数组分成两部分,再将1作为pivot将数组partition为两部分,毕。此方法适用于有k种颜色的情况。时间复杂度仍为O(n),但是two pass。代码如下:
class Solution { public: void sortColors(int A[], int n) { partition(partition(A, A + n, bind1st(equal_to<int>(), 0)), A + n, bind1st(equal_to<int>(), 1)); } };