Visionner la vidéo

Maîtrisez le tri Quicksort pour vos entretiens techniques 🚀

  Typescript

Introduction

Aujourd’hui, j’ai préparé un post un peu spéciale pour vous. Il se trouve que j’ai un ami qui a malheureusement raté son entretien technique parce qu’il n’a pas réussi à implémenter un tri quicksort.

De nos jours, la plupart des langages de haut niveau implémentent déjà ce genre de tri. Mais si vous tombez sur quelqu’un qui est fan d’algorithmie, vous pourriez avoir à en implémenter un durant l’entretien.

Du coup, je vous propose de décortiquer le fonctionnement du tri Quicksort dans cet article, afin de pouvoir assurer lors de vos prochains entretiens.

Comprendre le tri Quicksort

Je vais commencer par vous expliquer, à l’aide d’un diagramme, comment fonctionne le tri Quicksort.

Nous allons voir la version “in place” du Quicksort. Il faut savoir qu’il existe 2 autres versions, mais qui sont un peu plus complexes à mettre en œuvre.

Ce diagramme illustrera le déroulement complet d’un tri Quicksort, depuis un tableau de nombres. Nous allons explorer chaque étape pour voir comment l’algorithme s’exécute.

1ère Itération

Première itération du tri quicksort

La première étape consiste à sélectionner un pivot. Ici, le dernier élément de la liste, le nombre 5, est choisi comme pivot.

Nous allons maintenant diviser le tableau en deux sous-tableaux : l’un contenant les éléments inférieurs au pivot et l’autre avec les éléments supérieurs ou égaux au pivot.

Ensuite, nous parcourons notre tableau initial :

Je pense que vous avez saisi le principe. Il faut répéter cette opération jusqu’à arriver à notre pivot. Une fois arrivé au pivot, nous le plaçons à droite au début du tableau.

Fin de la première itération du tri quicksort

Il reste maintenant à répéter la même opération pour les 2 sous-tableaux que nous venons de créer.

2ème Itération

Commençons par la sous-liste de gauche. Nous prenons le dernier élément, à savoir 3, comme pivot.

Deuxième itération pour le tri quicksort

Ensuite, nous effectuons les mêmes comparaisons qu’auparavant à partir de ce pivot :

Nous plaçons ensuite le pivot au début du tableau situé à droite. Si nous observons les 2 listes, nos nombres sont désormais bien triés.

Fin de la deuxième itération pour la liste à gauche

Pour la liste de droite, nous répétons le même processus. Maintenant que vous avez compris le principe, je vais accélérer un peu, et cela donne ceci une fois les comparaisons effectuées.

Fin de la deuxième itération pour la liste à droite

Nous avons obtenu deux sous-listes, et elles ne sont pas encore totalement triées, donc nous allons répéter le processus.

3ème Itération

Pour la liste de gauche, on choisit 6 comme pivot, et nous allons répartir les résultats dans 2 sous-tableaux. Cela donne ceci comme résultat.

Fin de la troisième itération pour la liste à gauche

Enfin, il reste à faire de même pour la liste de droite, nous prenons 10 comme pivot, et nous répétons les comparaisons.

Fin de la troisième itération pour la liste à droite

Et voilà, notre tableau est désormais trié.

Implémentation en Typescript

Passons maintenant Ă  la pratique.

Je commence par définir une fonction quicksort. Cette fonction prendra en entrée un tableau de nombres et retournera un tableau trié.

function quicksort(arr: number[]): number[] {
    if (arr.length <= 1) {
        return arr;
    }

    const pivot = arr[arr.length - 1]; // Choix du pivot
    const leftArr = [];
    const rightArr = [];

    for (const el of arr.slice(0, arr.length - 1)) {
        if (el < pivot) {
            leftArr.push(el);
        } else {
            rightArr.push(el);
        }
    }

    // Recursion sur les sous-listes et combinaison des résultats
    return [...quicksort(leftArr), pivot, ...quicksort(rightArr)];
}

console.log(quicksort([2,4,1,3,6,8,10,9,7]));

Cas de base : Si le tableau a une longueur de 1 ou 0, il est déjà trié par définition, donc nous le retournons tel quel.

Choix du pivot : Nous prenons par défaut le dernier élément du tableau.

Initialisation des sous-tableaux : Un pour les éléments inférieurs au pivot et un pour les éléments supérieurs ou égaux au pivot.

Boucle pour diviser les éléments : Nous utilisons une boucle for of avec la méthode slice pour créer une copie du tableau d’origine en retirant le dernier élément. Les éléments sont ensuite triés dans le tableau de gauche ou de droite.

Recursion et combinaison : Nous retournons un tableau combinant le tableau trié à gauche, le pivot, et le tableau trié à droite pour former un tableau trié complet.

Et si j’exécute le script, l’algorithme a correctement trié le tableau. Magnifique !

Commentaires