# Tri pair-impair

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) :
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 :

## Réseau de tri
### 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$ et $j$ se note $[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]$ pour les entiers $i$ pairs (si on commence à 0) puis de la forme $[i:i+1]$ pour les entiers $i$ impairs. La taille d'un tel réseau est $n^{2}/2$, sa profondeur est $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$^,$ L'algorithme a été présenté à l'origine par Habermann en 1972. Il s'étend au cas de plusieurs items par comparateur (processeur). Ainsi, dans l'algorithme pair-impair de division-fusion de Baudet et Stevenson, 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.

### Preuve de correction

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},\ldots ,a_{n-1})$ une suite de 0 et 1.
Si $a_{n-1}=1$, les comparateurs $[n-2:n-1]$ sont inutiles. Si on supprime ces comparateurs, il reste un réseau pair-impair à $n-1$ fils qui, par hypothèse de récurrence, trie la suite $(a_{0},\ldots ,a_{n-2})$ de longueur $n-1$. Comme l'élément $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]$ ne modifie pas le résultat.
Si en revanche $a_{n-1}=0$, les comparateurs impliqués par cette valeur sont successivement $[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$ entrées.