Tri par insertion vs algorithmes de sorting par bulles

J’essaie de comprendre quelques algorithmes de sorting, mais j’ai du mal à voir la différence dans l’algorithme de sorting par sorting et d’insertion.

Je sais que les deux sont O (n 2 ), mais il me semble que le sorting par bulles ne fait que gonfler la valeur maximale du tableau vers le haut pour chaque passe, alors que le sorting par insertion Ne font-ils pas exactement la même chose, mais dans des directions différentes?

Pour le sorting par insertion, le nombre de comparaisons / swaps potentiels commence à zéro et augmente chaque fois (par exemple, 0, 1, 2, 3, 4, …, n) mais pour le sorting par bulles, le même comportement se produit le sorting (c’est-à-dire n, n-1, n-2, … 0) car le sorting par bulles n’a plus besoin d’être comparé aux derniers éléments au fur et à mesure de leur sorting.

Pour tout cela, le consensus semble être que le sorting par insertion est généralement meilleur. Quelqu’un peut-il me dire pourquoi?

Edit: Je m’intéresse principalement aux différences dans le fonctionnement des algorithmes, pas tellement leur efficacité ou leur complexité asymptotique.

Dans le sorting par bulles dans une itération, vous avez des itérations internes ni-1 (n ^ 2) / 2 au total, mais dans l’insertion, vous avez des itérations maximales à l’étape i, mais en moyenne, vous pouvez arrêter la boucle interne. plus tôt, après avoir trouvé la position correcte pour l’élément actuel. Donc, vous avez (sum de 0 à n) / 2 qui est (n ^ 2) / 4 au total;

C’est pourquoi le sorting par insertion est plus rapide que le sorting par bulles.

Tri par insertion

Après les itérations, les premiers éléments sont classés.

Dans chaque itération, l’élément suivant est projeté dans la section sortingée jusqu’à ce qu’il atteigne le bon endroit:

sorted | unsorted 1 3 5 8 | 4 6 7 9 2 1 3 4 5 8 | 6 7 9 2 

Le 4 est bullé dans la section sortingée

Pseudocode:

 for i in 1 to n for j in i downto 2 if array[j - 1] > array[j] swap(array[j - 1], array[j]) else break 

Tri à bulles

Après les itérations, les derniers éléments sont les plus gros et ordonnés.

Dans chaque itération, parcourez la section non sortingée pour trouver le maximum.

 unsorted | biggest 3 1 5 4 2 | 6 7 8 9 1 3 4 2 | 5 6 7 8 9 

Le 5 sort de la section non sortingée

Pseudocode:

 for i in 1 to n for j in 1 to n - i if array[j] > array[j + 1] swap(array[j], array[j + 1]) 

Notez que les implémentations typiques se terminent tôt si aucun échange n’est effectué pendant l’une des itérations de la boucle externe (car cela signifie que le tableau est sortingé).

Différence

Lors de l’insertion, des éléments de sorting sont introduits dans la section sortingée, tandis que dans le sorting par bulles, les maximums sortent de la section non sortingée.

Une autre différence, je n’ai pas vu ici:

Le sorting à bulles a 3 affectations de valeur par swap : vous devez d’abord créer une variable temporaire pour enregistrer la valeur que vous voulez pousser (no.1), alors que vous devez écrire l’autre variable swap dans la zone que vous venez d’enregistrer. de (no.2) et ensuite vous devez écrire votre variable temporaire à l’endroit autre endroit (no.3). Vous devez le faire pour chaque point – vous voulez avancer – pour sortinger votre variable au bon endroit.

Avec le sorting par insertion, vous mettez votre variable à sortinger une variable temporaire, puis vous placez toutes les variables devant ce point en arrière, tant que vous atteignez le bon emplacement pour votre variable. Cela fait 1 affectation de valeur par spot . A la fin, vous écrivez votre variable temporaire dans le spot.

Cela fait beaucoup moins d’atsortingbutions de valeur, aussi.

Ce n’est pas le meilleur avantage en termes de vitesse, mais je pense que cela peut être mentionné.

J’espère, je me suis exprimé compréhensible, sinon, désolé, je ne suis pas un Britannique natif

Le sorting par bulle n’est pas en ligne (il ne peut pas sortinger un stream d’entrées sans connaître le nombre d’éléments qu’il contient), car il ne garde pas vraiment de trace du maximum global des éléments sortingés. Lorsqu’un élément est inséré, vous devez commencer le bouillonnement dès le début.

Le principal avantage du sorting par insertion est son algorithme en ligne. Vous n’avez pas besoin d’avoir toutes les valeurs au départ. Cela pourrait être utile lorsque vous traitez des données provenant d’un réseau ou d’un capteur.

J’ai l’impression que ce serait plus rapide que les autres algorithmes conventionnels de n log(n) . Parce que la complexité serait n*(n log(n)) par exemple lire / stocker chaque valeur du stream ( O(n) ) et ensuite sortinger toutes les valeurs ( O(n log(n)) ) résultant en O(n^2 log(n))

Au contraire, en utilisant Insert Sort, il faut O(n) pour lire les valeurs du stream et O(n) pour mettre la valeur au bon endroit, donc O(n^2) seulement. Un autre avantage est que vous n’avez pas besoin de tampons pour stocker des valeurs, vous les sortingez dans la destination finale.

Le sorting de bulles de bulles est meilleur que le sorting par insertion uniquement lorsque quelqu’un recherche des éléments top k à partir d’une grande liste de nombres, c.-à-d. Cependant, après k itérations dans le sorting par insertion, cela garantit seulement que ces k éléments sont sortingés.

Bien que les deux sortes soient O (N ^ 2). Les constantes cachées sont beaucoup plus petites dans le sorting par insertion. Les constantes cachées font référence au nombre réel d’opérations primitives effectuées.

Lorsque le sorting par insertion a un meilleur temps d’exécution?

  1. Le tableau est presque sortingé – notez que le sorting par insertion effectue moins d’opérations que le sorting par bulles.
  2. Array est de taille relativement petite: vous pouvez déplacer des éléments par insertion, pour mettre l’élément en cours. Ce n’est que mieux que le sorting par bulles si le nombre d’éléments est limité.

Notez que le sorting par insertion n’est pas toujours meilleur que le sorting par bulles. Pour obtenir le meilleur des deux mondes, vous pouvez utiliser le sorting par insertion si le tableau est de petite taille et fusionner le sorting (ou le sorting rapide).

Le sorting à bulles est presque inutile en toutes circonstances. Dans les cas d’utilisation où le sorting par insertion peut avoir trop de swaps, le sorting par sélection peut être utilisé car il garantit moins de N fois de swap. Comme le sorting par sélection est meilleur que le sorting par bulles, le sorting par bulles n’a aucun cas d’utilisation.

Nombre d’échange dans chaque itération

  • Le sorting par insertion fait au plus 1 échange à chaque itération .
  • Le sorting par bulles effectue 0 à n permutations à chaque itération.

Accéder à une pièce sortingée et la modifier

  • Le sorting par insertion accède (et change si nécessaire) à la partie sortingée pour trouver la position correcte du nombre considéré.
  • Une fois optimisé, le sorting par bulles n’accède pas à ce qui est déjà sortingé.

En ligne ou non

  • Le sorting par insertion est en ligne. Cela signifie que le sorting par insertion prend une entrée à la fois avant de le placer dans la position appropriée. Il n’est pas nécessaire de comparer uniquement adjacent-inputs .
  • Le sorting à bulles n’est pas en ligne. Il ne fonctionne pas une entrée à la fois. Il gère un groupe d’entrées (sinon toutes) dans chaque itération. Le sorting par bulle ne compare et n’échange que adjacent-inputs dans chaque itération.

sorting par insertion:

1.Dans le sorting d’insertion, l’échange n’est pas nécessaire.

2.la complexité temporelle du sorting par insertion est Ω (n) pour le meilleur cas et le pire cas pour O (n ^ 2).

Complexe 3.less par rapport au sorting à bulles.

4.exemple: insérer des livres dans la bibliothèque, organiser les cartes.

Tri à bulles: 1.Swapping requirejs dans le sorting à bulles.

2.la complexité temporelle du sorting par bulles est Ω (n) pour le meilleur cas et le pire cas pour O (n ^ 2).

3.plus complexe par rapport au sorting par insertion.

Le sorting par insertion peut être repris comme suit: « Recherchez l’élément qui devrait être à la première position (le minimum), faites un peu d’espace en déplaçant les éléments suivants et placez-le en première position. Bon. … “et ainsi de suite …

Le sorting à bulles fonctionne différemment et peut être repris comme suit: ” Tant que je trouve deux éléments adjacents dans le mauvais ordre, je les échange “.