Un type de tri. Tri stable. Il utilise la méthode de division et de conquête.
--Divisez le tableau à trier en deux ――Répétez la division en deux jusqu'à ce qu'il y ait un élément (divisez) --Comparer chaque élément principal et fusionner avec le plus petit nombre vers l'avant (résoudre, fusionner) --Comparez les premiers nombres des éléments triés et fusionnez-les côte à côte (conquérir, fusionner)

Référence: Kagoshima University HP
python
#Fusionnez après le démontage dans les plus petites unités. Répétez ce processus
def merge_sort(arr):
#Si l'élément est 1 ou 0, le tableau est renvoyé tel quel. (Parce qu'il n'y a pas de cible de comparaison et qu'il n'y a pas besoin de tri)
if len(arr) <= 1:
return arr
#Divisez en deux. Extraire uniquement la partie entière à séparer par découpage
mid = len(arr)//2
#Divisez le tableau d'origine en deux
arr1 = arr[:mid]
arr2 = arr[mid:]
#Continuez à diviser en deux jusqu'à l'unité minimale
#La récurrence se termine quand elle devient retour
arr1 = merge_sort(arr1)
arr2 = merge_sort(arr2)
return merge1(arr1, arr2)
#Comparez les deux éléments et placez le plus petit en premier
def merge1(arr1,arr2):
#Array pour mettre le résultat de la fusion
merged = []
l_i, r_i =0,0
while l_i < len(arr1) and r_i < len(arr2):
if arr1[l_i] <= arr2[r_i]:
merged.append(arr1[l_i])
l_i += 1
else:
merged.append(arr2[r_i])
r_i += 1
if l_i < len(arr1):
merged.extend(arr1[l_i:])
if r_i < len(arr2):
merged.extend(arr2[r_i:])
return merged
Vérification
list=[7,4,3,5,6,1,2]
merge_sort(list)
#[1, 2, 3, 4, 5, 6, 7]
Tout d'abord, considérons une fonction qui divise chaque élément.
python
def div_arr(arr):
#Si l'élément est 1 ou 0, le tableau est renvoyé tel quel. (Parce qu'il n'y a pas de cible de comparaison et qu'il n'y a pas besoin de tri)
if len(arr) <= 1:
return print(arr)
#Divisez en deux. Extraire uniquement la partie entière à séparer par découpage
mid = len(arr)//2
#Divisez le tableau d'origine en deux
arr1 = arr[:mid]
arr2 = arr[mid:]
#Continuez à diviser en deux jusqu'à l'unité minimale
#La récurrence se termine quand elle devient retour
arr1 = div_arr(arr1)
arr2 = div_arr(arr2)
Vérification
list=[7,4,3,5,6,1,2]
div_arr(list)
[7]
[4]
[3]
[5]
[6]
[1]
[2]
Le but est de préparer deux, arr1 et arr2. La valeur entrée dans la fonction est divisée en deux, et le traitement est toujours stocké à l'arrière (arr2).
Par conséquent, même après que arr1 se termine par un retour, le traitement continue autant que arr2 est stocké.
Je m'attendais à ce que le tableau soit sorti avec return arr, mais comme rien n'est affiché, je l'ai réglé sur return print (arr). (Je ne sais pas pourquoi ça n'apparaît pas ...)
python
def div_arr(arr):
if len(arr) <= 1:
return print(arr)
mid = len(arr)//2
arr1 = arr[:mid]
arr1 = div_arr(arr1)
python
list=[7,4,3,5,6,1,2]
div_arr(list)
[7]
Puisque seul arr1 est traité, seul [7] est sorti.
python
#Comparez les deux éléments et placez le plus petit en premier
def merge1(arr1,arr2):
#Array pour mettre le résultat de la fusion
#La valeur initiale est 0, mais le contenu augmente chaque fois que la fusion est répétée.
merged = []
#Valeur initiale du numéro de tableau de l'élément à comparer
l_i, r_i =0,0
#Condition de fin de boucle. Comparaison de tous les deux tableaux et fin
while l_i < len(arr1) and r_i < len(arr2):
#Si l'élément avant est plus petit
#S'ils sont identiques, donnez la priorité à l'autre partie
if arr1[l_i] <= arr2[r_i]:
merged.append(arr1[l_i])
#Ajoutez 1 au numéro de séquence afin que le même élément ne soit pas vérifié à nouveau.
l_i += 1
else:
merged.append(arr2[r_i])
r_i += 1
#Lorsque l'instruction while se termine, ajoutez la réponse entière qui n'a pas été ajoutée.
#Étant donné que chaque tableau a déjà été trié par ordre croissant, il est ajouté tel quel.
if l_i < len(arr1):
merged.extend(arr1[l_i:])
if r_i < len(arr2):
merged.extend(arr2[r_i:])
return merged
Vérification
a=[2,3]
b=[1,8,9]
merge1(a,b)
#[1, 2, 3, 8, 9]
python
#Tableau à trier
arr=[7,4,3,5,6]
#Premier processus
arr1=[7,4]
arr2=[3,5,6]
#Récursif arr1
arr1`=[7]
arr2`=[4]
##Solution de arr1##
merge`=[4,7]
#Récursif arr2
arr1``=[3]
arr2``=[5,6]
#arr2``Se répète
arr1```=[5]
arr2```=[6]
##arr2``Solution de##
merge``=[5,6]
##Solution de arr2##
merge```=[3,5,6]
## Enfin la solution d'Arr ##
merge=[3,4,5,6,7]
## La solution de arr est une fusion de arr1 et arr2
# Solution de la fusion arr1` = [4,7]
#fusion de solution arr2```=[3,5,6]
C'est compliqué. ** Les 3 dernières lignes sont importantes **
python
arr1 = merge_sort(arr1)
arr2 = merge_sort(arr2)
return merge1(arr1, arr2)
La valeur fusionnée (résultat de merge1) est entrée dans arr1 et arr2 chaque fois que merge_sort est effectué.
Il sera davantage fusionné.
Avec cela, les éléments décomposés à l'unité minimale sont réassemblés.
Recommended Posts