Sorte d\'insertion

La sorte d'insertion de est un algorithme de tri simple , une sorte de comparaison de dans laquelle la rangée assortie (ou la liste) est établie une entrée à la fois. Elle est beaucoup moins efficace sur de grandes listes que des algorithmes plus avancés tels que le Quicksort , le Heapsort , ou la sorte de fusion , mais elle a de divers avantages :

simple pour mettre en application
Efficace sur (tout à fait) de petits ensembles de données
Efficace sur les ensembles de données qui déjà sont sensiblement assortis : il fonctionne dans le temps d'O ( n + d ), où d est le nombre d'inversions
Plus efficace dans la pratique que la plupart des autres algorithmes simples du O ( n 2) tels que la sorte de choix ou le tri par échange de paire de clés : le temps moyen est le n 2/4 et il est linéaire dans le meilleur cas
stables (ne change pas l'ordre relatif des éléments avec des clefs égales)
sur place (exige seulement une quantité constante O (1) d'espace mémoire supplémentaire)
C'est un algorithme en ligne , parce qu'il peut assortir une liste pendant qu'il la reçoit.

Algorithme

En termes abstraits, chaque itération d'une sorte d'insertion enlève un élément des données d'entrée, l'insérant à la position correcte dans la liste déjà assortie, jusqu'à ce qu'aucun élément ne soit laissé dans l'entrée. Le choix dont l'élément pour enlever de l'entrée est arbitraire et peut être fait using presque n'importe quel algorithme bien choisi.

Le tri est sur place typiquement fait. La rangée en résultant après que les itérations du k contienne les premières entrées du k de la rangée d'entrée et soit assorties. Dans chaque étape, la première entrée restante de l'entrée est enlevée, inséré dans le résultat à la bonne position, de ce fait prolongeant le résultat :

devient :

avec chaque élément > X a copié vers la droite comme il est comparé contre le X .

La variante la plus commune, qui opère des rangées, peut être décrite comme :

supposent que nous avons une méthode appelée l'insertion de conçue pour insérer une valeur dans un ordre assorti au début d'une rangée. Il fonctionne en commençant à la fin de l'ordre et en décalant chaque endroit de l'élément un vers la droite jusqu'à ce qu'une position appropriée soit trouvée pour le nouvel élément. Il a l'effet secondaire de recouvrir la valeur stockée juste après l'ordre assorti dans la rangée.

  • Pour exécuter la sorte d'insertion, commencer à la fin gauche de la rangée et appeler l'insertion de pour insérer chaque élément produit dans sa position correcte. L'ordre commandé dans lequel nous l'insérons est stocké au début de la rangée dans l'ensemble d'index déjà examinés. Chaque insertion recouvre une valeur simple, mais c'est correcte parce que c'est la valeur que nous nous insérons.

    Une version simple du pseudo-code de l'algorithme complet suit, où les rangées zéro-sont basées : lang=" de insertionSort (rangée A) pour I = 1 à length-1 font valeur = A j = i-1 tandis que le >= 0 et A de j > la valeur font A + 1 = A j = j-1 A = valeur

    Bons et mauvais cas d'entrée

    Dans le meilleur cas d'une rangée déjà assortie, cette exécution de sorte d'insertion prend du temps du O ( n ) : dans chaque itération, le premier élément restant de l'entrée est seulement comparé au dernier élément de la sous-section assortie de la rangée. Ce même cas fournit le comportement des cas les pires pour le non-randomisé et mal mis en application Quicksort , qui prendra du temps du O ( n 2) d'assortir une liste déjà-assortie. Ainsi, si une rangée est assortie ou presque assortie, la sorte d'insertion surpassera de manière significative le quicksort.

    Le pire cas est une rangée assortie à l'envers l'ordre, car chaque exécution de la boucle intérieure devra balayer et décaler la section assortie entière de la rangée avant d'insérer le prochain élément. La sorte d'insertion prend du temps d'O ( n 2) dans ce pire cas aussi bien que dans le cas moyen, qui le rend impraticable pour assortir un grand nombre d'éléments. Cependant, la boucle intérieure de sorte d'insertion est, qui lui fait souvent un des algorithmes les plus rapides pour assortir un nombre restreint d'éléments, en général plus moins de 10 très rapides environ.

    Comparaisons à d'autres sortes

    La sorte d'insertion est très semblable à la sorte de choix . Juste comme dans la sorte de choix, après que le k traverse la rangée, les premiers éléments du k sont dans l'ordre assorti. Pour la sorte de choix, ce sont les plus petits éléments du k , alors que dans la sorte d'insertion elles sont celui qui les premiers éléments du k aient été dans la rangée non triée. L'avantage de sorte d'insertion est qu'il balaye seulement autant d'éléments pendant qu'il doit afin de placer le k + le ęr élément, alors que la sorte de choix doit balayer tous les éléments restants pour trouver le plus petit élément absolu.

    Le calcul simple prouve que la sorte d'insertion donc exécutera habituellement environ la moitié d'autant de comparaisons comme sorte de choix. Assumant le k + le grade du ęr élément est aléatoire, il sur la moyenne exigera la moitié de décalage des éléments précédents du k plus de, alors que la sorte de choix exige toujours balayer tous les éléments unplaced. Si la rangée n'est pas dans un ordre aléatoire, cependant, la sorte d'insertion peut effectuer juste autant de comparaisons comme sorte de choix (pour une liste renversé-assortie). Elle effectuera également loin peu de comparaisons, seulement le n - 1, si les données pré-sont assorties, ainsi la sorte d'insertion est beaucoup plus efficace si la rangée est déjà assortie ou " ; près de sorted." ; Il peut voir comme avantage pour quelques applications en temps réel du que la sorte de choix exécutera identiquement indépendamment de l'ordre de la rangée, alors que le temps de fonctionnement de sorte d'insertion peut varier considérablement.

    Tandis que la sorte d'insertion fait typiquement moins de comparaisons que la sorte de choix , elle exige plus écrit parce que la boucle intérieure peut exiger des grandes parties de décalage de la partie assortie de la rangée. Généralement la sorte d'insertion écrira aux temps de la rangée O ( n 2) tandis que la sorte de choix écrira seulement des temps d'O ( n ). Pour cette raison, la sorte de choix peut être meilleure dans les cas où écrit à la mémoire sont plus chers que lit, comme le EEPROM ou la mémoire Flash .

    Un certain Diviser-et-conquièrent les algorithmes tel que le Quicksort et la sorte de Mergesort en divisant périodiquement la liste en plus petites sous-listes qui sont alors assorties. Une optimisation utile dans la pratique pour ces algorithmes est de commuter à la sorte d'insertion pour le " ; enough" assorti ; sous-listes sur lesquelles la sorte d'insertion surpasse les algorithmes plus complexes. La taille de la liste pour laquelle la sorte d'insertion a l'avantage varie par l'environnement et l'exécution, mais est en général environ 8 à 20 éléments.

    Variantes

    Le D. Shell fait des améliorations substantielles à l'algorithme, et la version modifiée s'appelle la sorte de Shell de . Il compare des éléments séparés par une distance qui diminue sur chaque passage. Shell assortissent a distinctement amélioré des temps de fonctionnement dans le travail pratique, avec deux variantes simples ayant besoin de le temps d'O ( n 3/2) et d'O ( n 4/3).

    Si les comparaisons sont très coûteuses comparées aux échanges, comme cela est le cas par exemple pour des clefs de corde stockées par la référence ou avec l'interaction humaine (telle que choisir un d'une paire montrée côte à côte), alors using la sorte d'insertion binaire peut être une bonne stratégie. La sorte d'insertion binaire utilise la recherche dichotomique pour trouver le bon endroit pour insérer de nouveaux éléments, et exécute donc le \ lceil log_2 (n !) \ rceil comparaisons dans le pire des cas, qui est &Theta ; ( n de notation de n ). L'algorithme prend dans son ensemble toujours le &Theta ; ( n 2) temps en moyenne dû à la série d'échanges exigés pour chaque insertion, et puisqu'il emploie toujours la recherche dichotomique, le meilleur cas n'est plus &Omega ; ( n ) mais &Omega ; (notation n de n).

    Malheureusement, la recherche dichotomique sur une liste chaînée est impossible, ainsi nous dépensons toujours la recherche de temps d'O ( n 2). Si nous le remplaçons à la place par une structure de données plus sophistiquée tel qu'un tas ou l'arbre binaire , nous pouvons de manière significative diminuer la recherche et le temps d'insertion. C'est l'essence de la sorte de tas et de la sorte d'arbre binaire de .

    En 2004, la cintreuse, le Farach-Colton, et le Mosteiro ont édité une nouvelle variante de la sorte appelée de bibliothèque de de sorte d'insertion ou le a entaillé la sorte d'insertion qui laisse un nombre restreint d'espaces inutilisés (" ; gaps" ;) écarter dans toute la rangée. L'avantage est que les insertions ont besoin décalent seulement des éléments plus de jusqu'à ce qu'un espace soit atteint. Étonnant dans sa simplicité, ils prouvent que cet algorithme de tri fonctionne avec la probabilité élevée dans le temps d'O ( n de notation de n ).

    Random links:Numéro 13 (Shostakovich) de symphonie | Parc d'état général de café | Buranji | Ian Poulter | Donnie Brasco (film) | Clase_de_inserción