Seite 1 von 1

Prüfen ob eine Liste sortiert ist

Verfasst: Donnerstag 31. Oktober 2019, 17:00
von Rickery
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))                
                

Re: Prüfen ob eine Liste sortiert ist

Verfasst: Donnerstag 31. Oktober 2019, 17:31
von Sirius3
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.

Re: Prüfen ob eine Liste sortiert ist

Verfasst: Donnerstag 31. Oktober 2019, 17:32
von Bolitho

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.

Re: Prüfen ob eine Liste sortiert ist

Verfasst: Donnerstag 31. Oktober 2019, 17:56
von __blackjack__
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.

Re: Prüfen ob eine Liste sortiert ist

Verfasst: Donnerstag 31. Oktober 2019, 21:19
von Bolitho
Ja, ich war auf dem falschen Dampfer mit dem Algorithmus. Hatte es zwischenzeitlich bereits korrigiert. Danke für deinen Hinweis trotzdem.