#!/bin/bash
# bubble.sh : Tri bulle, en quelque sorte.

# Rappelle l'algorithme de tri bulle. Enfin, une version particulière...

#  À chaque itération successive à travers le tableau à trier, compare deux
#+ éléments adjacents et les échange s'ils ne sont pas ordonnés.
#  À la fin du premier tour, l'élémennt le "plus lourd" est arrivé tout en bas.
#  À la fin du deuxième tour, le "plus lourd" qui suit est lui-aussi à la fin
#+ mais avant le "plus lourd".
#  Et ainsi de suite.
#  Ceci signifie que chaque tour a besoin de se balader sur une partie de plus
#+ en plus petite du tableau.
#  Vous aurez donc noté une accélération à l'affichage lors des derniers tours.


echange()
{
  # Échange deux membres d'un tableau
  local temp=${Pays[$1]}      #  Stockage temporaire
                              #+ pour les éléments à échanger.
  Pays[$1]=${Pays[$2]}
  Pays[$2]=$temp
  
  return
}  

declare -a Pays  #  Déclaration d'un tableau,
                 #+ optionnel ici car il est initialisé tout de suite après.

#  Est-il permis de diviser une variable tableau sur plusieurs lignes en
#+ utilisant un caractère d'échappement ?
#  Oui.

Pays=(Hollande Ukraine Zaire Turquie Russie Yémen Syrie \
Brésil Argentine Nicaragua Japon Mexique Vénézuela Grèce Angleterre \
Israël Pérou Canada Oman Danemark France Kenya \
Xanadu Qatar Liechtenstein Hongrie)

# "Xanadu" est la place mythique où, selon Coleridge,
#+ Kubla Khan a décrété un summum de plaisir.


clear                 # Efface l'écran pour commencer.

echo "0: ${Pays[*]}"  # Liste le tableau entier lors du premier tour.

nombre_d_elements=${#Pays[@]}
let "comparaisons = $nombre_d_elements - 1"

index=1 # Nombre de tours.

while [ "$comparaisons" -gt 0 ]          # Début de la boucle externe.
do

  index=0  #  Réinitialise l'index pour commencer au début du tableau à chaque
           #+ tour.

  while [ "$index" -lt "$comparaisons" ] # Début de la boucle interne.
  do
    if [ ${Pays[$index]} \> ${Pays[`expr $index + 1`]} ]
    #  Si non ordonné...
    #  Rappelez-vous que \> est un opérateur de comparaison ASCII à l'intérieur
    #+ de simples crochets.

    #  if [[ ${Pays[$index]} > ${Pays[`expr $index + 1`]} ]]
    #+ fonctionne aussi.
    then
      echange $index `expr $index + 1`  # Échange.
    fi  
    let "index += 1" # Ou index+=1 sur Bash 3.1 et suivants
  done # Fin de la boucle interne.
  
# ----------------------------------------------------------------------
# Paulo Marcel Coelho Aragao suggère les boucles for comme alternative simple.
#
# for (( dernier = $nombre_d_elements - 1 ; dernier > 0 ; dernier-- ))
##                  Corrigé par C.Y. Hunt             ^  (Merci)
# do
#     for (( i = 0 ; i &lt; dernier ; i++ ))
#     do
#         [[ "${Pays[$i]}" > "${Pays[$((i+1))]}" ]] \
#             &amp;&amp; echange $i $((i+1))
#     done
# done
# ----------------------------------------------------------------------
 
let "comparaisons -= 1" #  Comme l'élément le "plus lourd" est tombé en bas,
                        #+ nous avons besoin de faire une comparaison de moins
			#+ à chaque tour.

echo
echo "$index: ${Pays[@]}"  # Affiche le tableau résultat à la fin de chaque tour
echo
let "index += 1"                # Incrémente le compteur de tour.

done                            # Fin de la boucle externe.
                                # Fini.

exit 0
