import java.util.LinkedList;
import java.util.Queue;

public class BullesQueue {

    /**
     * Effectue un parcours (bulle) dans une file.
     *
     * @param source      La file source contenant les entiers à trier.
     * @param destination La file destination pour stocker le résultat du parcours.
     * @return true si l'ordre des valeurs a changé, false sinon.
     */
    public static boolean bulle(Queue<Integer> source, Queue<Integer> destination) {
        boolean changed = false;
        if (source.isEmpty()) {
            return false;
        }

        int prev = source.poll(); // Récupère le premier élément
        while (!source.isEmpty()) {
            int current = source.poll();
            if (prev > current) { // Si les éléments ne sont pas dans l'ordre croissant
                changed = true;
                destination.add(current);
                prev = prev; // L'ordre change
            } else {
                destination.add(prev); // Ajoute directement dans l'ordre
                prev = current;
            }
        }
        destination.add(prev); // Ajoute le dernier élément
        return changed;
    }

    /**
     * Trie complètement une file d'entiers en utilisant la méthode bulle.
     *
     * @param file La file d'entiers à trier.
     */
    public static void tri(Queue<Integer> file) {
        Queue<Integer> intermediaire = new LinkedList<>();
        boolean changed;

        do {
            changed = bulle(file, intermediaire); // Effectue un parcours
            // Inverse les files
            Queue<Integer> temp = file;
            file = intermediaire;
            intermediaire = temp;
        } while (changed);

        // Affiche les valeurs triées
        while (!file.isEmpty()) {
            System.out.print(file.poll() + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Exemple d'utilisation avec des entiers passés en ligne de commande
        Queue<Integer> file = new LinkedList<>();
        for (String arg : args) {
            file.add(Integer.parseInt(arg));
        }

        // Trie la file et affiche le résultat
        tri(file);
    }
}
