Je sais que cette question a été répondue depuis un certain temps, mais j'ai une bonne implémentation stable de merge sort pour Array et jQuery dans mon presse-papiers, donc je vais la partager dans l'espoir que certains futurs chercheurs pourraient la trouver utile.
Cela vous permet de spécifier votre propre fonction de comparaison tout comme l'implémentation normale Array.sort
.
Implémentation
// Ajouter un merge sort stable aux prototypes Array et jQuery
// Remarque : Nous l'encapsulons dans une fermeture pour ne pas polluer le global
// namespace, mais nous ne l'insérons pas dans $(document).ready, car il n'est
// pas dépendant du DOM
(function() {
// exposer à Array et jQuery
Array.prototype.mergeSort = jQuery.fn.mergeSort = mergeSort;
function mergeSort(compare) {
var length = this.length,
middle = Math.floor(length / 2);
if (!compare) {
compare = function(left, right) {
if (left < right)
return -1;
if (left == right)
return 0;
else
return 1;
};
}
if (length < 2)
return this;
return merge(
this.slice(0, middle).mergeSort(compare),
this.slice(middle, length).mergeSort(compare),
compare
);
}
function merge(left, right, compare) {
var result = [];
while (left.length > 0 || right.length > 0) {
if (left.length > 0 && right.length > 0) {
if (compare(left[0], right[0]) <= 0) {
result.push(left[0]);
left = left.slice(1);
}
else {
result.push(right[0]);
right = right.slice(1);
}
}
else if (left.length > 0) {
result.push(left[0]);
left = left.slice(1);
}
else if (right.length > 0) {
result.push(right[0]);
right = right.slice(1);
}
}
return result;
}
})();
Exemple d'utilisation
var sorted = [
'Finger',
'Sandwich',
'sandwich',
'5 pork rinds',
'a guy named Steve',
'some noodles',
'mops and brooms',
'Potato Chip Brand® chips'
].mergeSort(function(left, right) {
lval = left.toLowerCase();
rval = right.toLowerCase();
console.log(lval, rval);
if (lval < rval)
return -1;
else if (lval == rval)
return 0;
else
return 1;
});
sorted == ["5 pork rinds", "a guy named Steve", "Finger", "mops and brooms", "Potato Chip Brand® chips", "Sandwich", "sandwich", "some noodles"];
6 votes
Depuis au moins Chrome's array sort ne semble pas être stable, compter sur le tri de tableau intégré n'est pas une option pour vous.
0 votes
Pour résumer : J'ai opté pour un tri fusion à la main en raison des incohérences de stabilité d'Array.sort entre les navigateurs modernes (principalement Chrome qui n'implémente pas un tri stable au moment de ce commentaire). Merci à tous pour votre aide!
1 votes
Que signifie le terme "stable" en matière de tri ?
3 votes
@mowwwalker Le tri stable est un tri dans lequel tous les éléments ayant la même valeur de tri sont laissés dans le même ordre que dans la collection d'origine. en.wikipedia.org/wiki/Sorting_algorithm#Stability
0 votes
Pour répondre à "quell est le meilleur algoritme à utiliser", nous devons savoir s'il y a une structure sous-jacente à vos données. Beaucoup des réponses ci-dessous parlent simplement de l'utilisation du tri par fusion ou du tri rapide, en réalité cela dépend des données. Ce n'est pas un problème simple à répondre, je dirais. Recherchez quelques algorithmes de tri et lisez à leur sujet pour voir ce que je veux dire. TimSort et Radix Sort sont deux bons exemples que je recommande de lire.
0 votes
Veuillez vous référer au lien suivant. khan4019.github.io/front-end-Interview-Questions/sort.html
0 votes
Vous pouvez utiliser
_.sortBy()
de lodash qui est stable.2 votes
À l'exception d'Internet Explorer,
Array.sort
est stable dans tous les navigateurs à partir de novembre 2018 tel que requis par la norme. Compatibilité des navigateurs