1. 程式人生 > ># 75. Sort Colors

# 75. Sort Colors

75. Sort Colors

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?

  顏色有0,1,2三種,只需要把陣列中為0的元素置於陣列的前部,陣列中為2的元素置於陣列的後部,放置好0與2之後,1會被放置在陣列的中部

class Solution {
public:
    void sortColors(vector<int>& A) {
        int size = A.size();
        int start = 0;
        int end = size - 1;
        for(unsigned i = 0; i<=end; i++)//i<=end:在重複查詢元素之前停止
        {
            int temp;
            while(A[i] == 2 && i<end)//i<end:避免進入死迴圈[2,0,2,1,1,0]
            {//交換
                temp = A[end];
                A[end] = A[i];
                A[i] = temp;
                end--;
            }
            while(A[i] == 0  && i>start)//i>start:避免進入死迴圈[2,0,2,1,1,0]
            {
                temp = A[start];
                A[start] = A[i];
                A[i] = temp;
                start++;
            }

        }
    }
};

注意程式中的兩個while迴圈位置不能對換,因為索引i按0->size-1的方向來遍歷陣列的,在它已經遍歷的陣列元素中肯定不會有2存在(有的話也已經被移到最後了),但是在它沒有遍歷的陣列元素中,可能會有0的存在比如[1,2,0],此時如果while(A[i] == 0 && i>start)在前,而while(A[i] == 2 && i<end)在後,輸出為[1,0,2]