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.
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
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é).
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?
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.
adjacent-inputs
. 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 “.