Le tri par fusion (ou merge sort en anglais) est l’un des algorithmes de tri les plus efficaces et couramment utilisés. Il appartient à la catégorie des algorithmes de tri diviser-pour-régner, ce qui signifie qu’il divise continuellement le tableau en deux moitiés jusqu’à ce qu’il atteigne des sous-tableaux de taille un, puis fusionne ces sous-tableaux dans un ordre trié. En JavaScript, le tri par fusion peut être implémenté de manière relativement simple et offre d’excellentes performances, notamment pour les grands ensembles de données. Dans cet article, nous allons explorer en détail l’implémentation de l’algorithme de tri par fusion en JavaScript.
L’algorithme de tri par fusion suit un processus récursif pour trier un tableau. Voici les étapes de base de son fonctionnement :
Le processus de division et de fusion se poursuit jusqu’à ce que le tableau soit complètement trié.
Voici une implémentation simple de l’algorithme de tri par fusion en JavaScript :
function merge(left, right) {
let result = [];
let leftIndex = 0;
let rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}
function mergeSort(array) {
if (array.length <= 1) {
return array;
}
const middle = Math.floor(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
Cette implémentation utilise deux fonctions : merge
et mergeSort
.
merge
prend deux tableaux triés left
et right
et les fusionne en un seul tableau trié.mergeSort
utilise la récursivité pour diviser le tableau en deux moitiés, puis appelle la fonction merge
pour fusionner les sous-tableaux triés.Voici comment utiliser cette implémentation de tri par fusion sur un tableau :
const array = [5, 3, 8, 4, 2, 7, 1];
console.log("Array avant le tri :", array);
const sortedArray = mergeSort(array);
console.log("Array après le tri :", sortedArray);
La complexité temporelle du tri par fusion est de O(n log n) dans tous les cas, ce qui en fait l’un des algorithmes de tri les plus efficaces. La complexité spatiale est de O(n), car l’algorithme nécessite de stocker les sous-tableaux lors de la division.
Voici comment nous pourrions illustrer quelques exemples d’application du tri par fusion en JavaScript à travers du code :
// Exemple 1 : Traitement de données dans les applications web
const userData = ['Alice', 'Bob', 'Charlie', 'David', 'Eve'];
const sortedUserData = mergeSort(userData);
console.log("Données des utilisateurs triées :", sortedUserData);
// Exemple 2 : Algorithmes de recherche et de filtrage
const searchResults = ['Résultat 3', 'Résultat 1', 'Résultat 2', 'Résultat 4'];
const sortedSearchResults = mergeSort(searchResults);
console.log("Résultats de recherche triés :", sortedSearchResults);
// Exemple 3 : Gestion de données dans les applications de commerce électronique
const productPrices = [19.99, 9.99, 29.99, 14.99];
const sortedProductPrices = mergeSort(productPrices);
console.log("Prix des produits triés :", sortedProductPrices);
// Exemple 4 : Visualisation de données
const monthlySales = [1000, 500, 1500, 2000, 800];
const sortedMonthlySales = mergeSort(monthlySales);
console.log("Ventes mensuelles triées :", sortedMonthlySales);
// Exemple 5 : Traitement de données dans les jeux
const playerScores = [1500, 1200, 1800, 900, 2000];
const sortedPlayerScores = mergeSort(playerScores);
console.log("Scores des joueurs triés :", sortedPlayerScores);
Ces exemples démontrent comment le tri par fusion peut être utilisé pour trier différentes structures de données dans des applications JavaScript, améliorant ainsi leur efficacité et leur lisibilité.
Voici quelques cas particuliers à considérer lors de l’implémentation du tri par fusion en JavaScript, avec des exemples de code :
Si le tableau à trier est déjà trié ou partiellement trié, cela peut affecter les performances du tri par fusion. Par exemple, un tableau déjà trié pourrait entraîner une réduction du nombre de comparaisons nécessaires, tandis qu’un tableau partiellement trié pourrait encore nécessiter un temps linéaire pour la fusion.
// Tableau déjà trié
const sortedArray = [1, 2, 3, 4, 5];
console.log("Avant le tri :", sortedArray);
const sortedArrayAfterMergeSort = mergeSort(sortedArray);
console.log("Après le tri :", sortedArrayAfterMergeSort);
La taille du tableau peut influencer les performances du tri par fusion. Pour de petits tableaux, le coût supplémentaire de la récursivité peut devenir significatif. En revanche, pour de très grands tableaux, le tri par fusion peut être plus efficace que d’autres méthodes de tri.
// Tableau de taille réduite
const smallArray = [5, 3, 8, 4];
console.log("Avant le tri :", smallArray);
const smallArrayAfterMergeSort = mergeSort(smallArray);
console.log("Après le tri :", smallArrayAfterMergeSort);
// Tableau de grande taille
const largeArray = Array.from({ length: 10000 }, () => Math.floor(Math.random() * 10000));
console.time("mergeSort");
const largeArrayAfterMergeSort = mergeSort(largeArray);
console.timeEnd("mergeSort");
La présence d’éléments dupliqués dans le tableau peut nécessiter une gestion particulière lors de l’implémentation du tri par fusion, notamment pour éviter les erreurs d’ordre ou les boucles infinies.
const arrayWithDuplicates = [5, 3, 8, 4, 3, 7, 1];
console.log("Avant le tri :", arrayWithDuplicates);
const arrayWithDuplicatesAfterMergeSort = mergeSort(arrayWithDuplicates);
console.log("Après le tri :", arrayWithDuplicatesAfterMergeSort);
En tenant compte de ces cas particuliers lors de l’implémentation du tri par fusion en JavaScript, vous pouvez garantir que votre algorithme de tri fonctionne de manière fiable dans une variété de situations.
Exemples avancés qui démontrent des fonctionnalités plus avancées ou des applications spécifiques du tri par fusion en JavaScript :
Vous pouvez rendre votre fonction de tri par fusion générique en acceptant une fonction de comparaison en tant que paramètre. Cela permet de trier des tableaux contenant différents types de données ou de trier des tableaux selon des critères personnalisés.
function mergeSort(array, compareFunction) {
if (array.length <= 1) {
return array;
}
const middle = Math.floor(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle);
return merge(mergeSort(left, compareFunction), mergeSort(right, compareFunction), compareFunction);
}
function merge(left, right, compareFunction) {
let result = [];
let leftIndex = 0;
let rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) {
if (compareFunction(left[leftIndex], right[rightIndex]) < 0) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}
// Exemple d'utilisation avec un tableau de chaînes de caractères triées par longueur
const strings = ['apple', 'banana', 'pear', 'orange', 'grape'];
const sortedStrings = mergeSort(strings, (a, b) => a.length - b.length);
console.log("Chaînes de caractères triées par longueur :", sortedStrings);
Pour traiter de très grands ensembles de données de manière efficace, vous pouvez implémenter une version asynchrone du tri par fusion en utilisant des opérations asynchrones telles que des promesses ou des callbacks. Cela permet de répartir la charge de travail sur plusieurs itérations, améliorant ainsi les performances.
async function asyncMergeSort(array) {
if (array.length <= 1) {
return array;
}
const middle = Math.floor(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle);
const [sortedLeft, sortedRight] = await Promise.all([
asyncMergeSort(left),
asyncMergeSort(right)
]);
return merge(sortedLeft, sortedRight);
}
// Exemple d'utilisation avec un grand tableau de nombres
const bigArray = Array.from({ length: 1000000 }, () => Math.floor(Math.random() * 1000000));
console.time("asyncMergeSort");
asyncMergeSort(bigArray).then(sortedArray => {
console.timeEnd("asyncMergeSort");
console.log("Tableau trié :", sortedArray);
});
Ces exemples avancés mettent en évidence la flexibilité et la puissance du tri par fusion en JavaScript, ainsi que sa capacité à être adapté à des besoins spécifiques ou à des contraintes de performance particulières.
Le tri par fusion est un algorithme de tri puissant et efficace qui trouve de nombreuses applications dans le domaine de l’informatique. En JavaScript, son implémentation peut être relativement simple à comprendre et à mettre en œuvre. Que ce soit pour trier de petites ou de grandes quantités de données, le tri par fusion offre des performances fiables et prévisibles, ce qui en fait un choix populaire pour de nombreuses applications. En comprenant son fonctionnement et en utilisant correctement ses implémentations, les développeurs JavaScript peuvent bénéficier d’un moyen efficace de trier leurs données.
Voici une série d’exercices conçus pour perfectionner vos compétences Excel. Les corrigés sont inclus pour…
Excel offre plusieurs méthodes pour calculer une moyenne tout en tenant compte des filtres ou…
Excel propose plusieurs fonctions pour insérer ou manipuler la date actuelle. Voici les principales méthodes…
Lorsque des nombres sont stockés sous forme de texte dans Excel, ils ne peuvent pas…
Extraire uniquement les chiffres d'une cellule contenant du texte et des nombres mélangés est une…
Pour supprimer plusieurs caractères spécifiques (par exemple, des symboles, chiffres ou lettres indésirables) dans des…
This website uses cookies.