Il est important de noter qu'un algorithme, c'est - O(N log N)
n'est pas toujours plus rapide dans la pratique qu'un O(N^2)
de l'algorithme. Il dépend des constantes, et la gamme de N
impliqués. (Rappelez-vous que asymptotique de la notation des mesures de taux relatif de croissance, pas de vitesse absolue).
Pour petite N
, le tri par insertion, en fait, fait battre fusion de tri. Il est également plus rapide pour la quasi-trier les tableaux.
Voici une citation:
Bien qu'il soit une des primaires algorithmes de tri avec O(N^2)
des cas les pires temps, le tri par insertion est l'algorithme de choix lorsque les données sont presque triées (parce que c'est adaptative) ou lorsque la taille du problème est de petite taille (car il a une faible surcharge).
Pour ces raisons, et parce qu'il est également stable, le tri par insertion est souvent utilisé comme récursive de la base de cas (lorsque la taille du problème est petit) pour la hausse des frais généraux divide-and-conquer algorithmes de tri, tels que la fusion de tri ou tri rapide.
Voici une autre citation de Meilleur algorithme de tri pour près de trier les listes de papier:
droite le tri par insertion est le meilleur pour les petits ou très près de listes triées
Ce que cela signifie est que, dans la pratique:
- Un algorithme Un1 avec plus asymptotique limite supérieure peut être préférable qu'un autre algorithme connu Une2 avec asymptotique inférieure à la limite supérieure de
- Peut-être Un2 est trop compliqué à mettre en œuvre
- Ou peut-être qu'il n'a pas d'importance dans la gamme de
N
considéré comme
- Certains algorithmes hybrides peut s'adapter à différents algorithmes en fonction de la taille de saisie
Questions connexes
Un exemple numérique
Considérons ces deux fonctions:
-
f(x) = 2x^2
; cette fonction est quadratique taux de croissance, c'est à dire "O(N^2)
"
-
g(x) = 10x
; cette fonction est linéaire et le taux de croissance, c'est à dire "O(N)
"
Maintenant, nous allons tracer les deux fonctions:
Source: WolframAlpha: plot 2x^2 and 10x for x from 0 to 10
Notez qu'entre x=0..5
, f(x) <= g(x)
, mais pour un gros x
, f(x)
rapidement épuiser g(x)
.
De la même façon, si Un1 est un algorithme quadratique avec un minimum de coûts, et Une2 est un algorithme linéaire avec un haut dans le ciel, pour les plus petites d'entrée, Un1 peut être plus rapide qu' Un2.
Ainsi, vous pouvez, si vous choisissez de le faire, créer un algorithme hybride d'Un3 qui sélectionne simplement l'un des deux algorithmes en fonction de la taille de l'entrée. Si oui ou non cela vaut la peine de l'effort dépend de paramètres effectifs impliqués.
De nombreux tests et comparaisons des algorithmes de tri ont été faites, et il a été décidé que, parce que le tri par insertion battements de fusion de tri pour les petits tableaux, ça valait le coup de mettre en œuvre à la fois pour Arrays.sort
.