Algoritmes de tri
En cela, nous échangeons l'élément supérieur avec son voisin jusqu'à atteindre la fin du tableau. L'élément le plus élevé se trouve désormais en dernière position. Nous modifions donc la limite et la diminuons de 1 par rapport à la précédente. Au pire, nous devons itérer n fois pour trier le tableau.
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
Algorithme -
Complexité temporelle :
Complexité spatiale - O(1), aucune mémoire supplémentaire requise.
Avantages -
Aucune mémoire supplémentaire requise.
Stable car les éléments gardent leur ordre relatif.
Inconvénients -
Applications-
En cela, nous trouvons le plus petit élément du tableau et le remplaçons par le premier élément. Ensuite, nous augmentons la limite de 1 et répétons les mêmes étapes jusqu'à atteindre la fin du tableau.
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
Algorithme -
Parcourez le tableau et trouvez l'élément minimum.
Échangez-le avec le premier élément et augmentez le pointeur de 1.
Répétez ce processus jusqu'à ce que nous atteignions la fin du tableau.
Complexité temporelle : Il a une complexité temporelle de O(n2) dans les trois cas : meilleur, moyen et pire. C'est parce que nous devons sélectionner l'élément minimum et échangez-le à chaque fois, que le tableau soit déjà trié ou non.
Complexité spatiale - O(1), aucune mémoire supplémentaire requise.
Avantages -
Aucune mémoire supplémentaire requise.
Moins d'échanges sont effectués que dans le tri à bulles.
Inconvénients -
Complexité temporelle - O(n2), qui est très élevée pour les grands ensembles de données.
Non stable, car il ne maintient pas l'ordre relatif des éléments égaux.
Applications -
Il peut être utilisé dans des systèmes avec une mémoire limitée car il ne nécessite pas de stockage supplémentaire.
Il est utilisé dans les systèmes où il est essentiel de minimiser le nombre d'échanges, comme dans les systèmes avec des opérations d'écriture lentes.
C'est un algorithme qui fonctionne en insérant un élément non trié dans sa position correcte en vérifiant itérativement en arrière depuis la position de l'élément jusqu'au début du tableau.
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
Algorithme -
Partez du deuxième élément du tableau et comparez-le avec le premier élément. Si l'élément actuel est plus petit que le premier élément, échangez-les.
Augmentez maintenant le pointeur et faites ceci pour le troisième élément : comparez-le avec le deuxième et le premier élément.
Répétez le même processus pour le reste des éléments, en les comparant avec tous les éléments précédents, et insérez-les à la position appropriée.
Complexité temporelle :
- Meilleur cas - Si le tableau est déjà trié, une seule itération est requise. La complexité temporelle est O(n)
- Cas moyen - si le tableau est trié aléatoirement, alors la complexité temporelle est O(n2)
- Pire des cas - si le tableau est par ordre décroissant alors nous aurons besoin de n2 itérations.
Complexité spatiale - O(1), aucune mémoire supplémentaire requise.
Avantages -
Inconvénients -
Complexité temporelle - O(n2), qui est très élevée pour les grands ensembles de données.
Non stable, car il ne maintient pas l'ordre relatif des éléments égaux.
Applications-
Merge Sort est un algorithme qui suit l'approche diviser pour régner. Il comporte deux étapes principales : premièrement, diviser le tableau de manière récursive et deuxièmement, fusionner les tableaux divisés dans un ordre trié.
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
Algorithme -
Divisez le tableau en deux moitiés en calculant le point médian.
Continuez à diviser jusqu'à ce que la longueur de chaque sous-tableau soit de 1.
Appelez la fonction de fusion sur les deux moitiés : la moitié gauche et la moitié droite.
Utilisez trois pointeurs pour le processus de fusion :
Parcourez les deux moitiés et comparez leurs éléments. Insérez le plus petit élément dans le tableau trié et incrémentez le pointeur correspondant de 1.
Répétez ce processus de manière récursive jusqu'à ce que l'ensemble du tableau soit trié.
Complexité temporelle : Le tri par fusion a une complexité temporelle de O(n log n) dans les trois cas : meilleur, moyen et pire. En effet, que le tableau soit déjà trié ou non, les mêmes étapes sont suivies pour chaque division et fusion.
O(log n) - La taille du tableau est réduite de moitié à chaque étape pendant la phase de division.
O(n) - Pendant le processus de fusion, nous devons parcourir tous les éléments une fois.
Donc, la complexité temporelle totale est O (n) * O (log n) = O (n log n)
Complexité spatiale - O(n), Une mémoire supplémentaire est requise pendant le processus de fusion pour stocker les tableaux temporaires.
Avantages -
Stable, car les éléments conservent leur ordre relatif.
La complexité temporelle est O (n log n), même pour les grands ensembles de données.
Convient au traitement parallèle car les sous-tableaux sont fusionnés indépendamment.
Inconvénients -
Applications -
Quick Sort est un algorithme qui suit l'approche diviser pour régner. Nous choisissons un élément pivot et partitionnons le tableau autour de l'élément pivot après avoir placé le pivot dans sa position triée correcte.
La première étape consiste à choisir l'élément pivot puis à partitionner le tableau autour du pivot. Tous les éléments plus petits que le pivot seront à gauche et tous les éléments supérieurs au pivot seront à sa droite. Le pivot est alors dans sa bonne position triée. De manière récursive, le même processus est appliqué en divisant le tableau en deux moitiés : la première moitié contient les éléments avant le pivot, et la seconde moitié contient les éléments après le pivot. Ce processus est répété jusqu'à ce que la longueur de chaque sous-tableau atteigne 1.
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
Algorithme -
Complexité temporelle :
1. Meilleur cas - Complexité temporelle - O(n log n), lorsque le pivot divise le tableau en deux moitiés égales.
2. Cas moyen - Complexité temporelle - O(n log n), lorsque le pivot divise le tableau en deux moitiés égales. Mais pas forcément égal.
3. Dans le pire des cas - Complexité temporelle - O(n2) , Quand -
Le plus petit élément est choisi comme pivot dans un tableau déjà trié.
Le plus grand élément est choisi comme pivot dans un tableau trié par ordre décroissant.
O(log n) - La taille du tableau est réduite de moitié à chaque étape pendant la phase de division.
O(n) - Lors de la commande des éléments.
Donc, la complexité temporelle totale est O (n) * O (log n) = O (n log n)
Complexité spatiale :
Meilleur cas et cas moyen - O(log n) - pour la pile récursive.
Pire des cas - O(n) - pour la pile récursive.
Avantages -
Inconvénients -
Applications -
Heap Sort est un algorithme de tri basé sur la comparaison. Il s'agit d'une extension de Selection Sort. Dans Heap Sort, nous créons un tas binaire et échangeons l'élément maximum ou minimum avec le dernier élément. Ensuite, nous réduisons la taille du tas de 1. Ce processus est répété jusqu'à ce que la longueur du tas soit supérieure à 1.
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
Algorithme -
a.Son enfant gauche est à l'index 2i 1
b. Son enfant droit est à l'index 2i 2
Complexité temporelle : Heap Sort a une complexité temporelle de O(n log n) dans les trois cas : meilleur, moyen et pire. En effet, que le tableau soit déjà trié ou non, les mêmes étapes sont suivies chaque fois qu'un tas maximum est créé et qu'un élément est échangé.
O(log n) - Pour créer un tas maximum
O(n) - Lorsque le tas maximum est créé et qu'un élément est échangé n fois.
Donc, la complexité temporelle totale est O (n) * O (log n) = O (n log n)
Complexité spatiale : Pour tous les cas - O( log n) - pour la pile récursive.
Avantages -
Inconvénients -
Applications -
Counting Sort est un algorithme de tri sans comparaison. Il est particulièrement efficace lorsque la plage de valeurs d’entrée est petite par rapport au nombre d’éléments à trier. L'idée de base derrière Counting Sort est de compter la fréquence de chaque élément distinct dans le tableau d'entrée et d'utiliser ces informations pour placer les éléments dans leurs positions triées correctes.
Radix Sort utilise Counting Sort comme sous-programme. Il applique le tri par comptage à chaque chiffre d'un nombre et trie à plusieurs reprises jusqu'à ce qu'il traite tous les chiffres du plus grand nombre du tableau.
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
Algorithme -
Trouvez le nombre maximum dans le tableau et déterminez le nombre de chiffres (d) qu'il contient. Si la longueur du nombre est d, Counting Sort est appelé d fois sur le tableau.
Tri du comptage d'appels pour chaque chiffre du tableau, en commençant par celui des unités, puis celui des dizaines, et ainsi de suite.
Dans le tri Comptage :
Complexité temporelle :
Tri par comptage a une complexité temporelle de O(n k), où n est le nombre d'éléments à trier et k est la plage de valeurs (taille du tableau d'index). Cette complexité est valable pour les trois cas : le meilleur, la moyenne et le pire.
En effet, que le tableau soit déjà trié ou non, les mêmes étapes sont suivies à chaque fois.
La complexité temporelle duRadix Sort augmente d'un facteur d, où d est le nombre de chiffres du plus grand nombre du tableau. La complexité temporelle est O (d * (nk))
Donc, la complexité temporelle totale est O (d) * O(n k) = O (d * (n k))
Complexité spatiale : pour tous les cas - O(n k), où n est la longueur du tableau d'entrée et k est la plage de valeurs dans le tableau d'index.
Avantages -
Inconvénients -
Applications -
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!