Sort colors
Given an arrayNObjects 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.
Click to show follow up.
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.
Cocould you come up with an one-pass algorithm using only constant space?
Algorithm ideas:
Train of Thought 1: Scan both sides. A prompt has been given in the question to open hash [3], record count, and then fill in array again
The Code is as follows:
1 public class Solution { 2 public void sortColors(int[] A) { 3 int[] hash = new int[3]; 4 for(int tem : A){ 5 hash[tem]++; 6 } 7 int index = 0; 8 for(int i = 0; i < 3;i++){ 9 while(hash[i] != 0){10 A[index++] = i;11 hash[i]--;12 }13 }14 }15 }
Idea 2:
Double pointer method. (The three-way-partition section in quicksort mentioned in algorithms. For details, see here)
- The first and last two pointers point to the Start Element of 1 and the end element of 1 respectively.
The Code is as follows:
public class Solution { public void sortColors(int[] a) { if (a == null || a.length < 2) return; int end = a.length - 1,begin = 0; int i = 0; while(i <= end){ if(a[i] == 1){ i++; }else if(a[i] == 2){ swap(a, end--, i); }else{ swap(a, begin++, i++); } } } private void swap(int[] a,int i ,int j){ int tem = a[i]; a[i] = a[j]; a[j] = tem; } }