Échanger des éléments⚓︎
Problème et solution⚓︎
Lors du tri de tableaux, nous allons bien souvent échanger des valeurs.
Par exemple, échanger "Riri"
et "Loulou"
dans le tableau ci-dessous :
Question
Quelle est la valeur de neveux
après l'exécution des ces instructions ?
-
["Riri", "Fifi", "Loulou"]
-
["Loulou", "Fifi", "Loulou"]
-
["Loulou", "Fifi", "Riri"]
-
["Riri", "Fifi", "Riri"]
-
["Riri", "Fifi", "Loulou"]
-
["Loulou", "Fifi", "Loulou"]
-
["Loulou", "Fifi", "Riri"]
-
["Riri", "Fifi", "Riri"]
En effet, l'instruction neveux[0] = neveux[2]
affecte la valeur "Loulou"
à la cellule d'indice 0
. Le "Riri"
est donc « écrasé ». L'instruction neveux[2] = neveux[0]
ne fait alors que recopier le "Loulou"
dans la cellule d'indice 2
.
Nous ne pouvons donc pas procéder ainsi. À moins de pouvoir effectuer les deux instructions « en même temps » (nous verrons cela un peu plus loin).
Si l'on se représente le problème différemment, échanger les valeurs dans un tableau s'apparente à échanger le contenu des deux verres ci-dessous.
Comme on peut l'imaginer, il est nécessaire d'utiliser un troisième verre : nous devons utiliser une troisième variable.
Question
Compléter le script ci-dessous permettant d'échanger les valeurs d'indices 0
et 1
de la list
fruits
.
Dans une fonction⚓︎
Nous allons faire un usage intensif des échanges de valeurs. Regroupons ce code dans une fonction.
Question : la fonction echange
Compléter la fonction echange
qui prend en argument un tableau
ainsi que deux entiers i
et j
et échange les éléments d'indices i
et j
dans tableau
.
On garantit que i
et j
sont des indices valides.
Attention
Cette fonction ne renvoie rien !
# Tests
(insensible à la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Attardons-nous sur ce code et observons son fonctionnement :
En même temps !⚓︎
Revenons au cas des deux verres observés plus haut. Afin d'échanger leur contenu, il nous a semblé indispensable d'utiliser un troisième verre... Sauf si l'on est dans la station spatiale internationale ! Observez sur cette photo comment se comporte le liquide ... (source : Nasa)
Python autorise ce genre d'astuce. Il est ainsi possible d'échanger deux valeurs « en même temps ».
Pour ce faire, on utilise l'affectation multiple :
Notez comme l'ordre des indices a été échangé : 2
et 6
avant l'affectation, 6
et 2
après.
C'est un échange simultané. Souvenez vous du tout premier exemple, où une variable en "écrasait" une autre ...
Nous pouvons désormais alléger la fonction echange
.
Question : la fonction echange_V2
Modifier la fonction echange
afin qu'elle utilise l'affectation multiple.
La modification du tableau se fera en place : la fonction ne renverra rien
# Tests
(insensible à la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Question : la fonction renverse
On souhaite écrire une fonction renverse
prenant en argument un tableau
et le renversant : le premier élément est échangé avec le dernier, le deuxième avec l'avant-dernier etc, s'ils existent.
La modification s'effectuant en place, la fonction ne renverra rien.
# Tests
(insensible à la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Astuce
On doit échanger le premier élément et le dernier, le deuxième et l'avant-dernier, le troisième et l'avant-avant-dernier, etc. jusqu'à un certain point !
Solution
Il s'agit d'échanger les éléments du début du tableau avec ceux de la fin. On utilise deux indices i
et j
, l'un progressant du début vers la fin du tableau, l'autre de la fin vers le début.
À chaque étape du parcours, on échange les éléments d'indices i
et j
.
Lorsque i
devient supérieur ou égal à j
, cela signifie que l'on a dépassé le milieu du tableau : tous les échanges souhaités ont eu lieu.
Question : la fonction melange
Avant de trier des tableaux, apprenons à les mélanger !
L'algorithme de Fisher-Yates est un classique et permet de mélanger un tableau en place.
Son fonctionnement est le suivant (on considère un tableau de longueur n
) :
- Effectuer un parcours à rebours des indices du tableau à l'aide d'une variable
i
allant den - 1
inclus jusqu'à0
exclu,- À chaque itération, créer une variable
j
et lui affecter un entier aléatoire entre0
inclus eti
exclu, - Échanger les éléments d'indice
i
etj
dans le tableau, - passer à l'itération suivante.
- À chaque itération, créer une variable
Compléter la fonction melange
faisant subir cet algorithme à l'argument tableau
.
# Tests
(insensible à la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Astuce (1)
La méthode randint
du module random
prend deux arguments a
et b
et renvoie un entier aléatoire entre a
et b
(inclus l'un et l'autre).
Astuce (2)
Pour effectuer le parcours à rebours allant de n - 1
inclus jusqu'à 0
exclu on peut saisir for i in range(n - 1, 0, -1):
.
# Tests
(insensible à la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)