package cn.iocoder.yudao.framework.common.thealgorithms.misc;

import java.util.Scanner;

/**
 * The array is divided into four sections: a[1..Lo-1] zeroes a[Lo..Mid-1] ones
 * a[Mid..Hi] unknown a[Hi+1..N] twos If array [mid] =0, then swap array [mid]
 * with array [low] and increment both pointers once. If array [mid] = 1, then
 * no swapping is required. Increment mid pointer once. If array [mid] = 2, then
 * we swap array [mid] with array [high] and decrement the high pointer once.
 * For more information on the Dutch national flag algorithm refer
 * https://en.wikipedia.org/wiki/Dutch_national_flag_problem
 */
public final class Sort012D {
    private Sort012D() {
    }

    public static void main(String[] args) {
        Scanner np = new Scanner(System.in);
        int n = np.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = np.nextInt();
        }
        sort012(a);
        np.close();
    }

    public static void sort012(int[] a) {
        int l = 0;
        int h = a.length - 1;
        int mid = 0;
        int temp;
        while (mid <= h) {
            switch (a[mid]) {
            case 0: {
                temp = a[l];
                a[l] = a[mid];
                a[mid] = temp;
                l++;
                mid++;
                break;
            }
            case 1:
                mid++;
                break;
            case 2: {
                temp = a[mid];
                a[mid] = a[h];
                a[h] = temp;
                h--;
                break;
            }
            default: {
                throw new IllegalArgumentException("Unexpected value: " + a[mid]);
            }
            }
        }
        System.out.println("the Sorted array is ");
        for (int i = 0; i < a.length; i++) {
            System.out.print(+a[i] + " ");
        }
    }
}
