Tri Par Sélection
Définition
Le tri par sélection (ou tri par extraction) est un
algorithme de tri par comparaison. Cet algorithme est simple,
mais considéré comme inefficace car il s'exécute en
temps quadratique en le nombre d'éléments à trier, et non en
temps pseudo linéaire.
Sur un tableau de n éléments (numérotés de 0
à n-1 , attention un tableau de 5 valeurs (5
cases) sera numéroté de 0 à 4 et non de 1 à 5),
le principe du tri par sélection est le suivant :
rechercher le plus petit élément du tableau, et
l'échanger avec l'élément d'indice 0 ;
rechercher le second plus petit élément du
tableau, et l'échanger avec l'élément d'indice
1 ;
continuer de cette façon jusqu'à ce que le
tableau soit entièrement trié.
En pseudo-code, l'algorithme s'écrit ainsi :
Une variante consiste à procéder de façon
symétrique, en plaçant d'abord le plus grand
élément à la fin, puis le second plus grand élément
en avant-dernière position, etc.
Le tri par sélection peut aussi être utilisé sur des
listes. Le principe est identique, mais au lieu de
déplacer les éléments par échanges, on réalise des
suppressions et insertions dans la liste.
Tri à Bulles
Le tri à bulles ou tri par propagation est un
algorithme de tri. Il consiste à comparer répétitivement
les éléments consécutifs d'un tableau, et à les permuter
lorsqu'ils sont mal triés. Il doit son nom au fait qu'il
déplace rapidement les plus grands éléments en fin de
tableau, comme des bulles d'air qui remonteraient
rapidement à la surface d'un liquide.
Le tri à bulles est souvent enseigné en tant qu'exemple
algorithmique, car son principe est simple. Mais c'est le
plus lent des algorithmes de tri communément
enseignés, et il n'est donc guère utilisé en pratique.
Principe et pseudo-code
L'algorithme parcourt le tableau et compare les éléments consécutifs.
Lorsque deux éléments consécutifs ne sont pas dans l'ordre, ils sont
échangés.
Après un premier parcours complet du tableau, le plus grand élément
est forcément en fin de tableau, à sa position définitive. En effet,
aussitôt que le plus grand élément est rencontré durant le parcours, il
est mal trié par rapport à tous les éléments suivants, donc échangé à
chaque fois jusqu'à la fin du parcours.
Après le premier parcours, le plus grand élément étant à sa position
définitive, il n'a plus à être traité. Le reste du tableau est en revanche
encore en désordre. Il faut donc le parcourir à nouveau, en s'arrêtant à
l'avant-dernier élément. Après ce deuxième parcours, les deux plus
grands éléments sont à leur position définitive. Il faut donc répéter les
parcours du tableau, jusqu'à ce que les deux plus petits éléments soient
placés à leur position définitive.
Le pseudo-code suivant est repris de Knuth.
Une optimisation courante de ce tri consiste à
l'interrompre dès qu'un parcours des éléments
possiblement encore en désordre (boucle interne) est
effectué sans échange. En effet, cela signifie que tout
le tableau est trié. Cette optimisation nécessite une
variable supplémentaire.
Recherche séquentielle
Recherche séquentielle
La recherche séquentielle ou recherche
linéaire est un algorithme pour trouver une
valeur dans une liste. Elle consiste simplement
à considérer les éléments de la liste les uns
après les autres, jusqu'à ce que l'élément soit
trouvé, ou que toutes les cases aient été lues.
Elle est aussi appelée recherche par balayage.
Principe
La recherche séquentielle consiste à prendre
les éléments de la liste les uns après les autres,
jusqu'à avoir trouvé la cible, ou avoir épuisé la
liste
Comparaison
Sur les tableaux triés, la
recherche dichotomique est beaucoup plus
rapide dans le cas le pire (logarithmique). Si
les données sont en plus régulièrement
espacées, alors la recherche par interpolation
est encore plus efficace.
Recherche dichotomique
La recherche dichotomique, ou recherche par dichotomie (en anglais
: binary search), est un algorithme de recherche pour trouver la
position d'un élément dans un tableau trié. Le principe est le suivant :
comparer l'élément avec la valeur de la case au milieu du tableau ; si les
valeurs sont égales, la tâche est accomplie, sinon on recommence dans
la moitié du tableau pertinente.
Le nombre d'itérations de la procédure, c'est-à-dire le nombre de
comparaisons, est logarithmique en la taille du tableau. Il y a de
nombreuses structures spécialisées (comme les tables de hachage) qui
peuvent être recherchées plus rapidement, mais la recherche
dichotomique s'applique à plus de problèmes.
Exemple introductif
On peut illustrer l'intérêt de la recherche dichotomique par l'exemple du jeu
suivant.
A et B jouent au jeu suivant : A choisit un nombre entre 1 et 20, et ne le
communique pas à B, B doit trouver ce nombre en posant des questions à A
dont les réponses ne peuvent être que « Non, plus grand », « Non, plus petit »
ou « Oui, trouvé ». B doit essayer de poser le moins de questions possible.
Une stratégie pour B est d'essayer tous les nombres, mais il peut aller plus
rapidement comme le montre le scénario suivant :
A choisit 14 et attend les questions de B :
B sait que le nombre est entre 1 et 20 ; au milieu se trouve 10 (ou 11), B
demande donc : « Est-ce que le nombre est 10 ? ». A répond « Non, plus petit ».
B sait maintenant que le nombre est entre 11 et 20 ; au milieu se trouve 15 (ou
16), il demande donc : « Est-ce que le nombre est 15 ? » A répond « Non, plus
petit »
Et ainsi de suite : « Est-ce 12 ? » (12 < (11+14)÷2 < 13), « Non, plus grand »,
« Est-ce 13? » (13 < (13+14)÷2 < 14), « Non, plus grand », « Est-ce bien 14 ? »,
« Oui, trouvé »
B a trouvé le nombre choisi par A en seulement 5 questions.
Description de l'algorithme :
Principe :
L'algorithme est le suivant :
Trouver la position la plus centrale du tableau (si le tableau
est vide, sortir).
Comparer la valeur de cette case à l'élément recherché.
Si la valeur est égale à l'élément, alors retourner la position,
sinon reprendre la procédure dans la moitié de tableau
pertinente.
On peut toujours se ramener à une moitié de tableau sur un
tableau trié en ordre croissant. Si la valeur de la case est plus
petite que l'élément, on continuera sur la moitié droite, c'est-
à-dire sur la partie du tableau qui contient des nombres plus
grands que la valeur de la case. Sinon, on continuera sur la
moitié gauche.