Licence 1

Algorithmes simples

55 min15 exercicesSéquence 3.3Licence 1

Vidéo disponible dans la version Premium

Durée : 55 min

Algorithmes simples

### 1. Recherche dans une liste (recherche séquentielle)

Pour savoir si une valeur v se trouve dans une liste L, on parcourt la liste élément par élément :

> def recherche(L, v):
> for x in L:
> if x == v:
> return True
> return False

Cette méthode, appelée recherche séquentielle, a un coût proportionnel à la longueur de la liste dans le pire cas (la valeur n'est pas présente, ou se trouve en dernière position) : on dit qu'elle est de complexité linéaire, O(n)O(n)n=len(L)n=\text{len}(L).

Variante : trouver l'indice d'une valeur.

> def indice(L, v):
> for i in range(len(L)):
> if L[i] == v:
> return i
> return -1

On renvoie souvent 1-1 par convention pour signaler que la valeur n'a pas été trouvée.

### 2. Tri par sélection

Le tri par sélection construit la liste triée en répétant le principe suivant : trouver le plus petit élément restant et le placer en tête.

> def tri_selection(L):
> n = len(L)
> for i in range(n):
> indice_min = i
> for j in range(i+1, n):
> if L[j] < L[indice_min]:
> indice_min = j
> L[i], L[indice_min] = L[indice_min], L[i]
> return L

À chaque étape ii, on cherche le minimum parmi les éléments d'indices i,i+1,,n1i, i+1, \ldots, n-1 (la partie non encore triée), puis on l'échange avec l'élément d'indice ii.

Exemple résolu : trier [5,2,8,1,9][5, 2, 8, 1, 9].

- i=0i=0 : minimum de [5,2,8,1,9][5,2,8,1,9] est 11 (indice 33) → échange : [1,2,8,5,9][1,2,8,5,9]
- i=1i=1 : minimum de [2,8,5,9][2,8,5,9] (indices 11 à 44) est 22, déjà en place : [1,2,8,5,9][1,2,8,5,9]
- i=2i=2 : minimum de [8,5,9][8,5,9] est 55 (indice 33) → échange : [1,2,5,8,9][1,2,5,8,9]
- i=3i=3 : minimum de [8,9][8,9] est 88, déjà en place : [1,2,5,8,9][1,2,5,8,9] (trié)

### 3. Tri par insertion (alternative)

Le tri par insertion construit la partie triée en insérant chaque nouvel élément à sa bonne place parmi les éléments déjà triés :

> def tri_insertion(L):
> for i in range(1, len(L)):
> cle = L[i]
> j = i - 1
> while j >= 0 and L[j] > cle:
> L[j+1] = L[j]
> j = j - 1
> L[j+1] = cle
> return L

### 4. Calcul de moyenne et de somme

> def somme(L):
> s = 0
> for x in L:
> s = s + x
> return s
>
> def moyenne(L):
> return somme(L) / len(L)

### 5. Calcul itératif du PGCD (algorithme d'Euclide)

Le PGCD (plus grand commun diviseur) de deux entiers aa et bb se calcule par l'algorithme d'Euclide, fondé sur la propriété pgcd(a,b)=pgcd(b,amodb)\text{pgcd}(a,b)=\text{pgcd}(b, a \bmod b), avec pgcd(a,0)=a\text{pgcd}(a,0)=a :

> def pgcd(a, b):
> while b != 0:
> a, b = b, a % b
> return a

Exemple résolu : pgcd(48,18)\text{pgcd}(48, 18).

- (a,b)=(48,18)(a,b)=(48,18) : 48mod18=1248 \bmod 18 = 12 → nouveau couple (18,12)(18, 12)
- (18,12)(18,12) : 18mod12=618 \bmod 12 = 6(12,6)(12, 6)
- (12,6)(12,6) : 12mod6=012 \bmod 6 = 0(6,0)(6, 0)
- b=0b=0 : on renvoie a=6a=6.

Donc pgcd(48,18)=6\text{pgcd}(48,18)=6.

### 6. Résumé des complexités

| Algorithme | Complexité (pire cas) |
|---|---|
| Recherche séquentielle | O(n)O(n) |
| Tri par sélection | O(n2)O(n^2) |
| Tri par insertion | O(n2)O(n^2) |
| Algorithme d'Euclide | O(log(min(a,b)))O(\log(\min(a,b))) |

Exercices

Que renvoie recherche([3, 7, 1], 7) pour la fonction de recherche séquentielle du cours ?

Quel est le pgcd de 4848 et 1818 ?

Vrai ou faux : le tri par sélection trouve, à chaque étape, le plus petit élément restant et le place en tête de la partie non triée.

Quelle valeur renvoie la fonction indice(L, v) du cours si v n'est pas présent dans L ?

Quelle est la complexité (en pire cas) de la recherche séquentielle dans une liste de longueur nn ?

Suivez votre progression

Connectez-vous pour sauvegarder votre avancement et gagner des XP.

Se connecter