/* * Bandiera.java - questo programma risolve il problema 4.7 p. 116 di * Demetrescu, Finocchi, Italiano, "Algoritmi e strutture dati" * (seconda edizione), McGraw-Hill, 2008. * * Il problema della bandiera nazionale e' definito nel modo seguente: * Sia A un array di dimensione n, i cui elementi possono assumere * solo uno di tre possibili colori: bianco, verde e rosso. Vogliamo * ordinare l'array in modo che tutti gli elementi verdi precedano * quelli bianchi, e gli elementi bianchi precedano quelli * rossi. L'algoritmo deve richiedere tempo O(n) nel caso peggiore, * puo' solo scambiare elementi e non deve usare altri array * temporanei di appoggio. Non puo' nemmeno utilizzare contatori per * tenere traccia del numero di elementi di un certo colore presenti * (quindi non si puo' usare una variante dell'algoritmo counting * sort, che vedremo a lezione). L'algoritmo, infine, deve ordinare * gli elementi facendo una singola scansione dell'array. Assicurarsi * che l'algoritmo funzioni anche se mancano elementi di qualcuno dei * colori. * * Version 0.3 del 2009/11/25 * Autore: Moreno Marzolla (marzolla (at) cs.unibo.it) * * This file has been released by the author in the Public Domain */ public class Bandiera { public static final int VERDE = 1; public static final int BIANCO = 2; public static final int ROSSO = 3; /** * Scambia tra di loro gli elementi A[i] e A[j]. Attenzione: * nessun controllo viene effettuato circa la validita' degli * indici i e j. */ protected static void swap( int[] A, int i, int j ) { System.out.println("Scambia "+i+" con "+j); int tmp = A[i]; A[i] = A[j]; A[j] = tmp; } /** * Stampa a video il contenuto dell'array A */ public static void stampa( int[] A ) { for( int i=0; i