Tri pair-impair

Tri pair-impair
Exemple de tri d'une liste de nombres par le tri pair-impair.
Découvreur ou inventeur
Nico Habermann (en)Voir et modifier les données sur Wikidata
Date de découverte
Voir et modifier les données sur Wikidata
Problème lié
Algorithme de triVoir et modifier les données sur Wikidata
Structure des données
TableauVoir et modifier les données sur Wikidata
Complexité en temps
Pire cas
O ( n 2 ) {\displaystyle O(n^{2})} Voir et modifier les données sur Wikidata
Meilleur cas
O ( n ) {\displaystyle O(n)} Voir et modifier les données sur Wikidata
Complexité en espace
Pire cas
O ( 1 ) {\displaystyle O(1)} Voir et modifier les données sur Wikidata

modifier - modifier le code - modifier WikidataDocumentation du modèle

En informatique, le tri pair-impair, appelé plus précisément tri pair-impair par transposition (en anglais odd-even transposition sort) pour le distinguer du tri pair-impair de Batcher ou tri pair-impair par fusion (en anglais odd-even merge sort) est un algorithme de tri simple, basé sur le tri à bulles, avec lequel il partage quelques caractéristiques. Il opère en comparant tous les couples d'éléments aux positions paires et impaires consécutives dans une liste et, si un couple est dans le mauvais ordre (le premier élément est supérieur au second), il en échange les deux éléments.

L'algorithme continue en alternant les comparaisons entre éléments aux positions paires-impaires et aux positions impaires-paires consécutives jusqu'à ce que la liste soit ordonnée.

Le tri pair-impair peut être vu comme une version parallèle du tri à bulles, où les comparaisons commencent simultanément à toutes les positions de la liste (positions impaires dans la première passe).

En tant que réseau de tri, l'algorithme est peu efficace, ni en taille ni en profondeur, mais il a une structure particulièrement simple.

Pseudo-code

L'algorithme est aussi simple à mettre en œuvre que le tri à bulles. Le voici en pseudo-code (on suppose que les tableaux commencent à l'indice 0) :

trié = faux;
tantque non trié
  trié = vrai;
  comparaisons impaires-paires : 
  pour (x = 0; x < list.length-1; x += 2)
    si list[x] > list[x+1]
      échanger list[x] et  list[x+1]
      trié = faux;
  comparaisons paires-impaires : 
  pour (x = 1; x < list.length-1; x += 2)
    si list[x] > list[x+1]
      échanger list[x] et  list[x+1]
      trié = faux;

On peut encore simplifier le code en remplaçant la boucle extérieure - celle qui s'arrête quand la liste est triée - par un majorant sur le nombre de tours à faire : il suffit de faire n/2 tours pour une liste de taille n. On s'approche alors des réseaux de tri :

pour (i = 1; i < list.length-1; i += 1)
  comparaisons impaires-paires : 
  pour (x = 1; x < list.length-1; x += 2)
    si list[x] > list[x+1]
      échanger list[x] et  list[x+1]
  comparaisons paires-impaires : 
  pour (x = 0; x < list.length-1; x += 2)
    si list[x] > list[x+1]
      échanger list[x] et  list[x+1]

Réseau de tri

Article principal : réseau de tri.
Réseau de tri pair-impair de huit éléments. Il est formé de 4 étapes de 8 comparateurs, chacune comparant les éléments voisins aux positions paires-impaires, puis aux positions impaires-paires.

Réseau de tri pair-impair par transposition

Un réseau de comparateurs est fait de fils et de comparateurs. Les comparateurs comparent et échangent si nécessaire les données qui entrent par les données qui se trouvent sur les fils. Un réseau de tri est un réseau de comparateurs qui tri correctement les données. Le principe du zéro-un dit qu'un réseau de comparateurs est un réseau de tri s'il tri correctement les suites composées de 0 et de 1.

Un comparateurs pour les fils i {\displaystyle i} et j {\displaystyle j} se note [ i : j ] {\displaystyle [i:j]} . Le réseau pair-impair de n données est composé de n/2 tranches de comparateurs. Chaque tranche comporte n comparateurs, d'abord de la forme [ i : i + 1 ] {\displaystyle [i:i+1]} pour les entiers i {\displaystyle i} pairs (si on commence à 0) puis de la forme [ i : i + 1 ] {\displaystyle [i:i+1]} pour les entiers i {\displaystyle i} impairs. La taille d'un tel réseau est n 2 / 2 {\displaystyle n^{2}/2} , sa profondeur est n {\displaystyle n} . Ces deux nombres sont trop élevés pour en faire un réseau efficace en pratique pour des volumes importants, mais il a une structure particulièrement simple[1],[2] L'algorithme a été présenté à l'origine par Habermann en 1972[3]. Il s'étend au cas de plusieurs items par comparateur (processeur). Ainsi, dans l'algorithme pair-impair de division-fusion de Baudet et Stevenson[4], chaque processeur trie sa propre sous-liste à chaque étape, en utilisant un algorithme propre, puis réalise une fusion avec son voisin, où les voisins alternent entre pair-impair et impair-pair à chaque étape[5].

Preuve de correction

Tri pair-impair démonstration, deuxième cas.

Par le principe du zéro-un, il suffit de démontrer qu'une suite de 0 et 1 est correctement triée. La preuve est par récurrence sur le nombre n d'éléments à trier.

Quand n=1, le réseau est composé d'un seul fil sans comparateurs, et la suite est correctement trié. Supposons donc n>1, et soit ( a 0 , , a n 1 ) {\displaystyle (a_{0},\ldots ,a_{n-1})} une suite de 0 et 1.

Si a n 1 = 1 {\displaystyle a_{n-1}=1} , les comparateurs [ n 2 : n 1 ] {\displaystyle [n-2:n-1]} sont inutiles. Si on supprime ces comparateurs, il reste un réseau pair-impair à n 1 {\displaystyle n-1} fils qui, par hypothèse de récurrence, trie la suite ( a 0 , , a n 2 ) {\displaystyle (a_{0},\ldots ,a_{n-2})} de longueur n 1 {\displaystyle n-1} . Comme l'élément a n 1 = 1 {\displaystyle a_{n-1}=1} est déjà à sa bonne place, la suite entière est déjà triée, et réintroduire les comparateurs [ n 2 : n 1 ] {\displaystyle [n-2:n-1]} ne modifie pas le résultat.

Si en revanche a n 1 = 0 {\displaystyle a_{n-1}=0} , les comparateurs impliqués par cette valeur sont successivement [ n 2 : n 1 ] , [ n 3 : n 2 ] , , [ 0 , 1 ] {\displaystyle [n-2:n-1],[n-3:n-2],\ldots ,[0,1]} , et on peut considérer qu'ils réalisent chacun un échange (même si l'échange de deux valeurs toutes deux égales à 0 ne produit pas d'effet visible). On peut alors remplacer ces comparateurs correspondants par des lignes qui se croisent, et en "rehaussant" la deuxième partie du réseau d'un fil, on est ramené à un réseau à n 1 {\displaystyle n-1} entrées[2].

Notes et références

  1. Problème 27.1 : « Réseaux de tri par transposition», p. 697, dans Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction à l'algorithmique, Dunod, [détail de l’édition].
  2. a et b (en) H. W. Lang, « Odd-even transposition sort », Algorithmen - Sortieren - Networks, FH Flensburg, Allemagne, (consulté le ).
  3. Nico Haberman, « Parallel Neighbor Sort (or the Glory of the Induction Principle) », Carnegie Mellon University, Computer Science Report (Rapport technique), 1972, [lire en ligne]
  4. Gérard M. Baudet et David Stevenson, « Optimal Sorting Algorithms for Parallel Computers », IEEE Trans. Computers, vol. 27, no 1,‎ , p. 84-87 (DOI 10.1109/TC.1978.1674957).
  5. S. Lakshmivarahan, S. K. Dhall et L. L. Miller, « Parallel Sorting Algorithms », dans Marshall C. Yovits (éditeur), Advances in Computers, vol. 23, Academic Press, (ISBN 978-0-12-012123-6, lire en ligne), p. 295–351.

Articles connexes

v · m
Algorithmes de tri
Tris par comparaisons
Sans hypothèse autre
Complexité moyenne O ( n log n ) {\displaystyle {\mathcal {O}}(n\log n)}
Complexité moyenne O ( n 2 ) {\displaystyle {\mathcal {O}}(n^{2})}
Complexité moyenne moins bonne que O ( n 2 ) {\displaystyle {\mathcal {O}}(n^{2})}
Avec hypothèse supplémentaire
Réseau de tri
Tri utilisant d'autres opérations
Applications
  • icône décorative Portail de l’informatique
  • icône décorative Portail de l'informatique théorique