web-dev-qa-db-fra.com

Existe-t-il une bonne raison d'utiliser le tri par insertion?

Pour le tri à usage général, la réponse semble être non, car les tri rapide, fusionné et tas ont tendance à mieux fonctionner dans les scénarios des cas moyens et défavorables. Cependant, le tri par insertion apparaît dans Excel lors du tri incrémentiel, c’est-à-dire que l’on ajoute des éléments à une liste un par un pendant une longue période tout en maintenant la liste triée, en particulier si le tri par insertion est implémenté sous forme de liste chaînée (O n) cas moyen vs O (n)). Cependant, un segment de mémoire semble être en mesure d'effectuer (ou presque) aussi bien pour le tri incrémentiel (l'ajout ou la suppression d'un seul élément d'un segment de mémoire entraîne le pire des scénarios: O (log n)). Alors, qu'est-ce que le tri par insertion a à offrir par rapport aux autres algorithmes de tri ou tas?

34
CS Student

De http://www.sorting-algorithms.com/insertion-sort :

Bien que ce soit l'un des algorithmes de tri élémentaires avec Sur2) dans le cas le plus défavorable, tri par insertion est l'algorithme de choix soit quand les données sont presque triées (car est adaptative) ou lorsque la taille du problème est petit (parce qu’il a peu de frais généraux).

Pour ces raisons, et parce qu'il est également stable, le type d'insertion est souvent utilisé comme cas de base récursif (quand la taille du problème est petite) pour frais généraux plus élevés pour diviser pour régner algorithmes de tri, tels que le tri par fusion ou tri rapide.

49
guns

Un concept important dans l'analyse des algorithmes est l'analyse asymptotique. Dans le cas de deux algorithmes avec des durées d'exécution asymptotiques différentes, tels qu'un O (n ^ 2) et un O(nlogn) comme c'est le cas avec le tri par insertion et le tri rapide, il n'est pas certain que l'on est plus rapide que l'autre. 

La différence importante avec ce type d’analyse est que pour suffisamment grand N, un algorithme sera plus rapide que l’autre. Lorsque vous analysez un algorithme jusqu'à un terme comme O (nlogn), vous supprimez des constantes. Lors de l'analyse réaliste du fonctionnement d'un algorithme, ces constantes ne seront importantes que pour les situations de n petit.

Qu'est-ce que cela signifie? Cela signifie que pour certains petits n, certains algorithmes sont plus rapides. Cet article de EmbeddedGurus.net présente une perspective intéressante sur le choix de différents algorithmes de tri dans le cas d’un système à espace limité (16 Ko) et à mémoire limitée. Bien entendu, l'article ne fait que trier une liste de 20 nombres entiers; les ordres plus grands de n ne sont donc pas pertinents. Un code plus court et une consommation de mémoire moindre (tout en évitant la récursion) ont finalement été des décisions plus importantes.

Le tri par insertion nécessite peu de temps, il peut être écrit assez succinctement et présente deux avantages principaux: il est stable et son cas est assez rapide lorsque l'entrée est presque triée.

15
Anthony

Oui, il y a une raison d'utiliser soit un type d'insertion, soit l'une de ses variantes.

Les alternatives de tri (tri rapide, etc.) des autres réponses suggèrent ici que les données sont déjà en mémoire et prêtes à être utilisées.

Mais si vous essayez de lire une grande quantité de données à partir d'une source externe plus lente (disons un disque dur), vous perdez beaucoup de temps, car le goulot d'étranglement est clairement le canal de données ou le lecteur lui-même. Il ne peut tout simplement pas suivre le processeur. Une série naturelle d'attentes se produit pendant toute lecture. Ces temps d'attente sont cycles gaspillés de la CPU sauf si vous les utilisez pour trier à mesure que vous avancez.

Par exemple, si vous deviez trouver une solution à ce problème, procédez comme suit:

  1. Lire une tonne de données dans une boucle dédiée en mémoire
  2. Trier ces données

Vous prendriez probablement plus de temps que si vous faisiez la chose suivante dans deux threads.

Fil A:

  1. Lire une donnée
  2. Placer le datum dans la file d'attente FIFO
  3. (Répétez jusqu'à épuisement des données du lecteur)

Fil B:

  1. Obtenir une donnée de la file d'attente FIFO
  2. Insérez-le au bon endroit dans votre liste triée
  3. (Répétez jusqu'à ce que la file d'attente soit vide ET que le fil A indique "terminé").

... ce qui précède vous permettra d'utiliser le temps autrement perdu. Remarque: le fil B n'empêche pas la progression du fil A.

Au moment où les données sont entièrement lues, elles auront été triées et prêtes à être utilisées.

8
user4229245

La plupart des procédures de tri utilisent le tri rapide, puis le tri par insertion pour les très petits ensembles de données.

4
BobbyShaftoe

OUI,

Le tri par insertion est préférable au tri rapide dans les listes courtes.

En fait, un tri rapide optimal a un seuil de taille auquel il s’arrête, puis l’ensemble du tableau est trié par tri par insertion sur les limites du seuil.

Également...

Pour maintenir un tableau de bord, le tri par insertion binaire peut être aussi bon que possible.

Voir cette page .

1
JohnPaul

Si vous parlez de maintenir une liste triée, il n’ya aucun avantage par rapport à une sorte d’arbre, c’est juste plus lent.

Eh bien, peut-être qu'il consomme moins de mémoire ou est une implémentation plus simple.

L'insertion dans une liste triée impliquera une analyse, ce qui signifie que chaque insertion est O (n). Par conséquent, le tri de n éléments devient O (n ^ 2).

L'insertion dans un conteneur tel qu'un arbre équilibré est typiquement log (n), donc le tri est O (n log (n)), ce qui est bien sûr préférable.

Mais pour les petites listes, cela ne fait guère de différence. Vous pouvez utiliser un tri par insertion si vous devez l'écrire vous-même sans bibliothèque, si les listes sont petites et/ou si vous vous souciez peu des performances.

1
MarkR

Pour les petits tableaux, le tri par insertion est plus rapide que le tri rapide. Java 7 et Java 8 utilise le tri rapide à double pivot pour trier les types de données primitifs. Le tri rapide à pivot double effectue le tri rapide à pivot unique. Selon l'algorithme du quicksort à double pivot: 

  1. Pour les petits tableaux (longueur <27), utilisez l'algorithme de tri Insertion.
  2. Choisissez deux pivots ...........

Définitivement, le tri par insertion effectue un tri rapide pour les petits tableaux. C’est pourquoi vous passez au passage par insertion pour les tableaux de longueur inférieure à 27. La raison pourrait être qu'il n'y a pas de récursivité dans le type insertion.

Source: http://codeblab.com/wp-content/uploads/2009/09/DualPivotQuicksort.pdf

0
Kangkan Lahkar