À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri

Dernière fois Question pour trouver la valeur maximale ** pour une valeur donnée en tant que recherche conditionnelle (Il y a une réponse, mais (suer) est étudiée en Python Je l'ai écrit plus tard, mais cette fois *** tri *** est expliqué et le code C ++ est écrit, je pensais que c'était Python comme d'habitude, mais je ne pouvais pas le réparer moi-même, il a été posté par google En mémoire du code qui est.

Problème: tri rapide Code de réponse C ++
int compareFunc(const void * voidA, const void * voidB) {
    int * intA = (int *)(voidA);
    int * intB = (int *)(voidB);
return *intA - *intB;
}

const int ARRAY_SIZE = 10;
int intArray[ARRAY_SIZE] = {87,28,100,78,84,98,75,70,81,68};
qsort(intArray, ARRAY_SIZE, sizeof(int), compareFunc);

Il a été implémenté avec la fonction qsort.

Self (code emprunté) Python qui trie et renvoie le tableau donné par tri rapide

Site de référence → Tri rapide

test35.py


#!/usr/bin/env python
#coding:utf-8

def quicksort(seq):             
    if len(seq) < 1:             #Renvoie lui-même si la séquence seq donnée est inférieure à un
        return seq

    pivot = seq[0]               #tableau seq pour faire pivoter[0]Remplacez le th * Lorsqu'il est récursé, le tableau le plus à gauche th est affecté au pivot
    left = []                    #arrangement de gauche "Je me demande si la compréhension ici est différente" à faire pour accumuler de plus en plus
    right = []                   #tableau de droite même

    for x in range(1, len(seq)): #Répétez pour la longueur de 1 à l'exclusion de 0 dans la séquence seq
        if seq[x] <= pivot:      #Première séquence séquentielle[1]Est plus petit que pivot?
            left.append(seq[x])  #S'il est petit, stockez-le dans le tableau à droite et à gauche du tableau au centre du pivot
        else:
            right.append(seq[x]) #S'il est volumineux, stockez-le dans le tableau gauche droit du tableau au centre du pivot.

    left = quicksort(left)       ###Assigner le tableau de gauche stocké à la variable de gauche
    right = quicksort(right)     ###Comme ci-dessus
    foo = [pivot]                ###* Le problème est ici, mais pivot est un tableau appelé récursivement.[0]Puisqu'il s'agit de la deuxième valeur, est-ce une collection de celle-ci? ??
    return left + foo + right

seq = [87,28,100,78,84,98,75,70,81,68]
mx = quicksort(seq)
print(mx)

・ ・ ・(Résultat d'exécution du terminal)
>>> from test35 import quicksort
[28, 68, 70, 75, 78, 81, 84, 87, 98, 100]
>>> 

Comme c'était trop difficile à comprendre, je vérifierai l'intérieur avec une instruction d'impression dans la partie affectation pivot, changerai la partie retour *** ***, l'exécuterai et vérifierai ce qui est retourné

Retour à gauche uniquement

test35.py


#!/usr/bin/env python
#coding:utf-8

def quicksort(seq):
    if len(seq) < 1:
        return seq
    pivot = seq[0]
    print(pivot)
    left = []
    right = []
    for x in range(1, len(seq)):
        if seq[x] <= pivot:
            left.append(seq[x])
        else:
            right.append(seq[x])
    left = quicksort(left)
    right = quicksort(right)
    foo = [pivot]
    #return left + foo + right
    return left

seq = [87,28,100,78,84,98,75,70,81,68]
mx = quicksort(seq)
print(mx)

・ ・ ・(Résultat d'exécution)
>>> from test35 import quicksort
87
28
78
75
70
68
84
81
100
98
[]
>>> 
Ouais pourquoi? ?? Je suis sûr que je ne le stocke pas sur la gauche[87,28,100 ...]Etc
Je m'y attendais. La partie pivot est imprimée en premier, mais je peux la comprendre d'une manière ou d'une autre.
le pivot est de la séquence donnée[0]Puisque le deuxième élément est attribué, il sort tel quel.

J'ai pensé que c'était étrange et j'ai essayé de changer avec return foo + right, mais Résultats seulement

・ ・ ・(Résultat d'exécution)
>>> from test35 import quicksort
[87, 100]
>>> 
Oh, peut-être que la dernière séquence donnée est de retour? Qu'est-ce que le pivot? Le mystère est.

Enfin, quand j'essaye avec return foo, Résultats seulement

>>> from test35 import quicksort
[87]
>>> 
Ouais, après toute la dernière séquence donnée[0]Seul le deuxième élément est renvoyé.

Cela a été expliqué ainsi sur le site de référence.

Ceci est un exemple de mise en œuvre de l'organisation de la liste par ordre croissant. Le pivot est le premier élément de la liste, les éléments avec des valeurs inférieures sont stockés dans la liste de gauche, les éléments avec des valeurs plus élevées sont stockés dans la liste de droite, et la liste est finalement combinée autour du pivot.

J'ai compris le résultat de sortie comme indiqué dans le commentaire. Je suis désolé pour toutes les questions.

Recommended Posts

À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri
D'un livre que les programmeurs peuvent apprendre ... (Python): Pointer
À partir d'un livre que les programmeurs peuvent apprendre (Python): Décoder les messages
À partir d'un livre que le programmeur peut apprendre ... (Python): trouver la valeur la plus fréquente
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): examen des tableaux
À partir d'un livre que les programmeurs peuvent apprendre (Python): valeur de l'écart de traitement statistique
À partir d'un livre que le programmeur peut apprendre ... (Python): Recherche conditionnelle (valeur maximale)
À partir d'un livre que les programmeurs peuvent apprendre (Python): Déclaration de classe (public / privé, etc.)
D'un livre que les pensées du programmeur peuvent être apprises: résumez les parties de petits problèmes
À partir d'un livre que le programmeur peut apprendre ... Vérification de la somme de contrôle des runes (longueur fixe)
À partir d'un livre que le programmeur peut apprendre ... Vérification de la somme de contrôle des runes (longueur variable) Partie 2
À partir d'un livre que le programmeur peut apprendre ... Conversion de caractères qui représentent des nombres en type entier
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
8 services que même les débutants peuvent apprendre Python (des débutants aux utilisateurs avancés)
À propos de psd-tools, une bibliothèque capable de traiter des fichiers psd en Python
Essayez d'utiliser APSW, une bibliothèque Python que SQLite peut prendre au sérieux
"Kit Python" qui appelle des scripts Python depuis Swift
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
La façon de penser du programmeur provient du livre XX (Python)
"Un livre qui comprend Flask à partir de zéro" Lecture d'un mémo
La façon de penser du programmeur provient du livre XX (Python)
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Un mémo qui lit les données de dashDB avec Python et Spark
Programme Python du "Livre qui enseigne facilement la programmation difficile"
python Extraction de condition de la liste que j'oublie souvent
Mémorandum sur la corrélation [Python]
Un mémorandum sur le simulacre de Python
Programme Python qui agrège l'utilisation du temps à partir des données icalendar
Une note sur [python] __debug__
[Python] Créez un graphique qui peut être déplacé avec Plotly
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Faisons un livre Kindle qui visualise des formules mathématiques à partir de fichiers TeX
Création d'une bibliothèque pour python capable de gérer facilement la division morphologique
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[Algorithme Python] Un programme qui génère des réponses en allemand et en allemand à partir de la recherche de priorité en profondeur
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
Toucher les objets Python d'Elixir
Python: une note sur les classes 1 "Résumé"
À propos de Python, à partir et à l'importation, comme
python / Créer un dict à partir d'une liste.
Une note sur mock (bibliothèque fictive Python)
J'ai créé un modèle de projet Python générique
[Python] Un programme qui trouve une paire qui peut être divisée par une valeur spécifiée
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
À propos de "spleeter" qui peut séparer les voix et les instruments de musique des données musicales
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Créez un environnement virtuel Python que tout le monde peut comprendre Septembre 2016 (pyenv + virutalenv)
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
[Python] Création d'un outil qui peut lister, sélectionner et exécuter des fichiers python avec tkinter et à propos de la partie qui a été interceptée
Une histoire sur la conversion de HTML en PDF avec WeasyPrint + matplotlib et l'intégration de graphiques [Les débutants apprennent python avec un livre de référence]
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
[Python] Un programme qui crée des escaliers avec #
Un programmeur Java a étudié Python. (À propos du type)
# 5 [python3] Extraire des caractères d'une chaîne de caractères
[Python] Trier les types de collection comme référence
Créer un fichier deb à partir d'un package python
[Python] Créez un LineBot qui s'exécute régulièrement