Um ungeordnete Listen zu ordnen, verwendet man Sortierverfahren. Sortierungen
stellen dann eine wesentliche Voraussetzung für Suchverfahren dar. Um zu einer
sortierten Liste zu gelangen, gibt es verschiedene Vorgehensweise.
Das bekannteste
Verfahren ist wahrscheinlich die Selektion (Selectionsort),
Man nimmt aus einer Liste das kleinste Element, streicht es aus der Liste, und nimmt
als nächstes wieder das kleinste Element aus der jetzt bestehenden Liste, solange, bis
die Liste leer ist.
Die Sortierung eines Kartenspiels erfolgt dagegen anders. Zuerst hat man keine
Karte, dann die erste die logischerweise sortiert ist, die zweite Karte muss schon
eingefügt werden, die dritte ebenso .... So sollte man zwar nicht Skat spielen,
aber Karten sortiert man in der Regel auf diese Weise. Man fügt die Karten nach einem
Relationsmuster ein, (Insertsort). Beide Verfahren erinnern stark
an rekursive Algorithmen.
Ein weiteres Verfahren ist
(Bubblesort), das wahrscheinlich bekannteste einfache
Sortierverfahren. Es gibt aber kaum eine Entsprechung in der Realität, zudem ist
dieses Verfahren in Bezug auf seine Effizienz mit Abstand das schlechteste. Alle Verfahren lassen
sich sowohl rekursiv, als auch imperativ programmieren.
01 def selectionsort (liste): 02 if liste == [] : return [] 03 else : return cons (min (liste), selectionsort (delete(min(liste),liste))) |
01 def selectionsort (liste): 02 for i in range (0, len(liste) - 1): 03 k = i 04 # suche kleinsten Wert aus dem Rest der Liste 05 for j in range (i+1, len (liste)): 06 if liste [j] <= liste [k] : k = j 07 08 speicher = liste [k] 09 liste [k] = liste [i] 10 liste [i] = speicher 11 12 return liste |
01 def ins (elem, liste): 02 if liste == [] : return [elem] 03 elif hd(liste) < elem : return cons(hd(liste), ins (elem, tl(liste))) 04 else : return cons (elem, liste) 06 def insertsort (liste): 07 if liste == [] : return [] 08 else : return ins (hd(liste), insertsort (tl(liste))) |
01 def insertsort (liste): 02 for aktuell in range (1, len(liste)): 03 speicher = liste [aktuell] 04 zeiger = aktuell 05 while (zeiger > 0) and (speicher < liste [zeiger - 1]) : 06 liste [zeiger] = liste [zeiger -1] 07 zeiger = zeiger -1 08 liste [zeiger] = speicher 09 10 return liste |
01 def bubble (liste): 02 if liste == [] : return [] 03 elif len(liste) == 1 : return liste 04 elif hd(liste) > hd(tl(liste)) : return cons(hd(tl(liste)), bubble (cons(hd(liste), (tl(tl(liste)))))) 05 elif hd(liste) < hd(tl(liste)) : return cons(hd(liste), bubble (cons(hd(tl(liste)), (tl(tl(liste)))))) 06 def bsort (liste): 07 if liste == [] : return [] 08 else : return concat (bsort (init(bubble(liste))),[last (bubble(liste))]) |
01 def bubble (liste): 02 for j in range (0,len(liste)): 03 for i in range (0, len(liste)- 1): 04 if liste [i] > liste [i+1] : 05 liste [i+1], liste [i] = liste [i], liste [i+1] # swap 06 07 return liste |
Sortierverfahren Laufzeit Selectionsort O(n²) Insertsort O(n²) Bubblesort O(n²) |