Prüfen ob eine Liste sortiert ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Rickery
User
Beiträge: 1
Registriert: Donnerstag 31. Oktober 2019, 16:33

Einen wunderschönen Guten Tag,

gleich mal am Anfang. Im Studium habe ich jetzt zum ersten mal mit programmieren zu tun(studiere kein Informatik) und stehe dort noch ganz am Anfang, also verzeiht mir, wenn ich mich etwas dämlich anstelle.
Die Aufgabe war, eine Liste mit Zufallszahlen per SelectionSort zu sortieren. Das funktioniert auch soweit. Allerdings sollen wir bevor und nachdem wir die Liste sortieren abfragen ob die Liste sortiert ist oder nicht (per funktion). Diese soll dann wahr oder falsch ausgeben.

Soweit funktioniert auch alles, nur werden bei teste_sortierung scheinbar nur die ersten beiden Elemente verglichen und dann hört die Schleife auf. Ist das allgemein falsch oder woran kann das liegen?

Schonmal danke im voraus

Code: Alles auswählen

import random



def selectionsort(L):
    n = len(L)
    for i in range(n):
        for j in range(i+1,n):
            if  L[j] <= L[i]:
                L[i],L[j] = L[j],L[i]
                
            
def teste_sortierung(L):
    
    n=len(L)
    for i in range(n-1):
        if  (L[i] <= L[i+1]):
            return True
        else:
                return False
        

             
n = 5
    
liste = []
for i in range(n):
    liste.append(random.randint(0,1000))
      
print(liste)
teste_sortierung(liste)
print(teste_sortierung(liste))
selectionsort(liste)
print(liste)
teste_sortierung(liste)
print(teste_sortierung(liste))                
                
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit `return` verläßt Du die Schleife. Solange die Elemente richtig sortiert bist, mußt Du weiter prüfen. Nur beim Falsch-Ergebnis kannst Du die Suche mit `return` abbrechen.
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Code: Alles auswählen

import random


def selectionsort(liste):
    n = len(liste)
    for i in range(n):
        for j in range(i + 1, n):
            if liste[j] <= liste[i]:
                liste[i], liste[j] = liste[j], liste[i]


def teste_sortierung(liste):
    for i in range(len(liste) - 1):
        if not liste[i] <= liste[i + 1]:
            return False
    return True


n = 5

liste = []

for i in range(n):
    liste.append(random.randint(0, 1000))

print(liste)
teste_sortierung(liste)
print(teste_sortierung(liste))
selectionsort(liste)
print(liste)
teste_sortierung(liste)
print(teste_sortierung(liste))

Das hat nicht funktioniert, weil du mit einem if/else und anschließendem Return nur den ersten Wert der Schleife durchläufst und dann das Ergebnis schon zurückgibst. Tatsächlich musst du aber die gesamte Liste prüfen, bevor du sicher sein kannst, dass sie sortiert ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Für Testzwecke wäre so eine Ist-Sortiert-Funktion bei mir ein Einzeiler:

Code: Alles auswählen

def ist_sortiert(elemente):
    """
    Teste ob Sequenz mit Elementen sortiert ist oder nicht.
    
    >>> ist_sortiert([])
    True
    >>> ist_sortiert([1])
    True
    >>> ist_sortiert([1, 2, 3])
    True
    >>> ist_sortiert([2, 1, 3])
    False
    """
    return elemente == sorted(elemente)
@Bolitho: `sortiert` *und* `tausch` sind etwas zu viel des guten. Denn sortiert ist wenn nicht getauscht wurde, und wenn getauscht wurde ist nicht sortiert, die sagen letztlich beide das gleiche aus, bloss eben negiert. Zumal das auch irgendwie nicht nach Selectionsort aussieht sondern nach Bubblesort.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

Ja, ich war auf dem falschen Dampfer mit dem Algorithmus. Hatte es zwischenzeitlich bereits korrigiert. Danke für deinen Hinweis trotzdem.
Antworten