Python de tri rapide

Python de tri rapide
Quicksort est un algorithme de tri bien apprécié qui est fréquemment utilisé. Dans la première moitié de ce post, nous utiliserons des entiers simples, mais nous montrerons comment adapter cette technique pour trier les objets d'une classe personnalisée. Quicksort représente des algorithmes de tri divide et conquis, sur place et instable. Avant de trier récursivement les réseaux plus grands, diviser et conquérir divise le tableau en tableaux plus courts jusqu'à ce qu'il trouve un tableau vide, même un avec une seule entrée. Le tableau ou tout sous-référence ne sont pas dupliqués lorsqu'ils sont utilisés en place. Cependant, tous les appels récursifs cela nécessite la mémoire de pile nécessitant une mémoire de pile. Un algorithme de tri instable ne le garantit pas; Cela peut arriver, mais ce n'est pas garanti. Ceci est surtout pertinent lors du tri des objets plutôt que des types primitifs.

Exemple 1:

Nous commençons par choisir un élément pivot. Ensuite, pour traverser tous les éléments de la liste, nous utilisons Python pour la boucle. Si un nombre est <= to the pivot, it is shifted to the left. Otherwise, it shifts to the right side of the pivot. Our Python program returns the new high value. Item + 1 equals the new high value. After that, we must execute our algorithm. A separate procedure can be created to achieve this. This function compares the values of “low_point” and “high_point” to test if “low_pont” is less than “high_point.” We'll be likely to progress if that's the case. Otherwise, our sorting will come to a halt. When our sorting comes to a halt, it signifies the list has been sorted.

La méthode prépare () est alors appelée par notre code. Cela localise un pointeur pivot et transfère des choses à leurs emplacements appropriés. La méthode Quicksort () est ainsi appelée deux fois par notre programme. Nous utilisons Quicksort sur les pièces à gauche du pivot pour la première fois. Pour la 2ème tentative, nous utilisons Quicksort sur les objets à droite du pivot. En conséquence, parce qu'il s'appelle, notre fonction est récursive. Créons maintenant un programme principal qui crée une liste triable. Nous commençons par spécifier un ensemble de valeurs à trier. La fonction Python Len () est utilisée pour déterminer la longueur de notre ensemble d'attributs. Après cela, la méthode Quicksort () est appliquée.

Def prépare (Data, Low_point, High_point):
pivot = data [high_point]
n = low_point - 1
pour i dans la plage (low_point, high_point):
Si les données [i] <= pivot:
n = n + 1
(données [n], données [i]) = (données [i], données [n])
(données [n + 1], données [high_point]) = (données [high_point], données [n + 1])
retourner n + 1
def Quick_sort (Data, Low_point, High_point):
Si Low_pointpivot = préparer (data, low_point, high_point)
Quick_sort (Data, Low_point, Pivot - 1)
Quick_sort (données, pivot + 1, high_point)
my_list = [9, 5, 1, 7, 4, 2]
Total = len (my_list)
Quick_sort (my_list, 0, total - 1)
imprimer (my_list)

Ici, vous pouvez voir que les données sont triées.

Exemple 2:

Nous utiliserons deux fonctions dans cet exemple: partition () et Quicksort (). La fonction QuickSort () partitionne d'abord la collection, puis s'appelle récursivement sur les pièces partitionnées. Tout d'abord, regardons la fonction division (). Le pivot a été défini en premier, comme vous pouvez le voir dans le code. Si la valeur que nous visons en ce moment est supérieure au pivot. Nous pouvons passer à la pièce suivante sur la gauche car elle est sur le côté droit du pivot. Nous devons également nous assurer que nous n'avons pas réussi le pointeur bas, ce qui indique que tous les éléments ont été déplacés du bon côté du pivot. Après cela, la méthode opposée à celle ci-dessus est réalisée. Nous avons soit trouvé un numéro hors commande pour High_point et Low_point, soit Low_point est supérieur à High_Point, auquel cas nous quitterons la boucle. Enfin, mettons le code QuickSort () en action. Nous pouvons utiliser Quicksort () sur un tableau de base pour implémenter les deux fonctions (partition et Quicksort).

Def partition (arr1, start, fin):
pivot = arr1 [start]
low_point = start + 1
high_point = fin
Bien que vrai:
tandis que Low_point = pivot:
high_point = high_point - 1
tandis que Low_point<= high_point and arr1[low_point] <= pivot:
low_point = low_point + 1
Si Low_Point = end:
retour
p_func = partition (arr1, start, fin)
Quick_sort (Arr1, Start, P_func-1)
Quick_sort (Arr1, P_func + 1, fin)
Arr1 = [23,22,56,4,26,77,10,33,44,12,57,78,22,83,43,31,98,76]
Quick_sort (Arr1, 0, Len (Arr1) - 1)
Imprimer (Arr1)

C'est le résultat. Il n'y a aucune garantie que ces deux 22 étaient dans cet ordre car la méthode est instable. Peut-être qu'ils ont été changés au début, mais cela n'implique rien dans un tableau entier.

Exemple 3:

Nous allons trier les objets personnalisés dans cet exemple. Il existe plusieurs façons différentes d'étendre cet algorithme pour trier les objets personnalisés dans Python. Les opérateurs de comparaison pour une classe spécifique peuvent être implémentés dans un style pythonique, ce qui signifie que nous n'aurions pas à changer l'algorithme parce que>, ==, =, etc., fonctionnerait le mieux sur notre objet de classe. Une autre option consiste à demander à l'appelant de fournir à notre algorithme une méthode, qui serait ensuite utilisée pour effectuer la comparaison réelle des éléments. Il est assez simple de réécrire l'algorithme pour l'utilisation avec des objets sur mesure. Cependant, gardez à l'esprit que l'algorithme n'est pas complètement stable. Commençons par la classe étudiante. Cette classe n'a que deux caractéristiques: le nom et l'âge de l'élève. Nous allons trier par âge, ce que nous accomplirons en donnant à l'algorithme de tri une nouvelle fonction lambda. Mais d'abord, regardons comment cette fonction est utilisée dans l'algorithme. Au lieu d'utiliser les opérateurs = ou> = = faire une comparaison directe, nous utilisons la fonction pour déterminer quel élève est plus âgé. Lambda transmet l'objet par rapport à l'appel de tri rapide, qui fait la comparaison exacte d'attribut d'âge.

Élève de classe:
def __init __ (self, name_of_student, âge):
soi.name_of_student = name_of_student
soi.âge = âge
Def __str __ (Self):
se retourner.Nom de l'étudiant
Def partition (arr1, start, end, compare_func):
pivot = arr1 [start]
low_point = start + 1
high_point = fin
Bien que vrai:
tandis que Low_point<= high_point and compare_func(arr1[high_point], pivot):
high_point = high_point - 1
tandis que Low_point<= high_point and not compare_func(arr1[low_point], pivot):
low_point = low_point + 1
Si Low_Point = end:
retour

Ici, vous pouvez voir la liste triée des noms.

Conclusion:

Un tableau est subdivisé à l'aide de l'algorithme Python Quicksort, puis trier chaque entrée dans la liste; Cette méthode appelle ces sous-tableaux à plusieurs reprises. Nous avons parcouru ce concept en profondeur avec des exemples dans cet article.