2011-08-09 4 views
2

Plusieurs fois, je dois trier de grandes quantités de petites listes, de tableaux. Il est assez rare que j'ai besoin de trier de grands tableaux. Quelle est l'algorithme de tri rapide pour le tri:Le tri le plus rapide pour les petites collections

  • tableaux
  • (tableau) énumère

de taille 8-15 éléments de ces types:

  • entier
  • chaîne de 10 à 40 caractères

?

Je répertorie les types d'éléments car certains algorithmes comparent plus les opérations et moins les opérations d'échange. J'envisage le tri par fusion, le tri rapide, le tri par insertion et le tri des coques (incrément de 2^k - 1).

Répondre

13

Arrays.sort(..)/Collections.sort(..) prendra cette décision pour vous.

Par exemple, le openjdk-7 implementation of Arrays.sort(..) a INSERTION_SORT_THRESHOLD = 47 - il utilise le tri d'insertion pour ceux avec moins de 47 éléments.

+2

Exactement, et pour les petites collections, la différence d'efficacité est à peine perceptible de toute façon sur les machines modernes. –

+0

Je m'attendais à la réponse que "ce n'est pas grave". Il est important que le serveur traite quelques douzaines de requêtes par seconde avec quelques dizaines de tri chacune. Le tri par fusion produit beaucoup d'allocations et rend le collecteur de données plus difficile. Ce seuil de tri d'insertion est-il utilisé dans l'implémentation Sun/Oracle Java 6? Sinon, ça fait peu pour m'aider. –

+0

Vous pouvez vérifier le code Java 6 pour savoir exactement quel est le seuil. Mais l'algorithme est spécifié depuis longtemps, donc je ne m'attends pas à une différence majeure. – Bozho

1

Sauf si vous pouvez prouver que cela est un goulot d'étranglement alors construit en sortes sont très bien:

Collections.sort(myIntList); 

Arrays.sort(myArray); 
1

En fait, il n'y a pas une réponse universelle. Entre autres choses, la performance d'un algorithme de tri Java dépendra du coût relatif de l'opération de comparaison, et (pour certains algorithmes) de l'ordre de l'entrée. Dans le cas d'une liste, cela dépend également du type d'implémentation de la liste.

Mais les conseils de @ Bozho sont sains, tout comme le commentaire de @Sean Patrick Floyd.


FOLLOWUP

Si vous pensez que la différence de performance va être important pour votre cas d'utilisation, alors vous devriez mettre la main sur certaines implémentations d'algorithmes différents, et de les tester à l'aide du données réelles que votre application doit traiter. (Et si vous n'avez pas encore les données, il est trop tôt pour commencer à régler votre application, car les performances de tri dépendront des données réelles.)

En bref, vous devrez effectuer vous-même l'analyse comparative.

Questions connexes