• Keine Ergebnisse gefunden

„Sortier-Algorithmen“ Informatik II – Kapitel 12

N/A
N/A
Protected

Academic year: 2021

Aktie "„Sortier-Algorithmen“ Informatik II – Kapitel 12"

Copied!
10
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Informatik II – Kapitel 12

„Sortier-Algorithmen“

Zusammenfassung des Kapitel 12

Küchlin, Weber, Einführung in die Informatik, 2.Auflage

11.6.2004

(2)

m a r c – o l i v e r p a h l

Sortierverfahren

• Greedy

• SelectionSort (durch Auswahl)

• InsertionSort (durch Einfügen)

• BubbleSort (durch Vertauschen)

• Divide & Conquer

– Hard Split/ Easy Join

• QuickSort

– Easy Split/ Hard Join

• MergeSort

(3)

m a r c – o l i v e r p a h l

newList:

this:

Greedy.SelectionSort (auf Liste)

36 9 11 2 23

36 11 23 2 9

36 9 11 23 2

36 23 2 9 11

36 2 9 11 23

36 9 11

2 23

public OrderedList selectionSort(){

int min;

OrderedList newList = new OrderedList();

while( head != null ){

min = findMin();

deleteElem(min);

newList.insertLast(min);

}

return newList;

}

Anmerkung:

Diese Implementierung baut eine neue Liste auf, man könnte zum Sortieren auch die Verkettungs- reihenfolge auf der bestehenden Liste ändern.

Letztendlich läuft es aber auf fast

dasselbe hinaus, da die nicht mehr

verlinkten ListNodes automatisch

durch den garbage collector im

Speicher freigegeben werden.

(4)

m a r c – o l i v e r p a h l

data:

Greedy.SelectionSort (auf Reihung)

36 9 11 2 23

Comparable[] data;

public void selectionSort(){

int min;

for( int next = 0; next < data.length-1; next++ ){

min = findMin( next, data.length-1 );

swap( next, min);

} }

next: 0; min: 3;

2 9 11 36 23 next: 1; min: 1;

2 9 11 36 23 next: 2; min: 2;

2 9 11 36 23 next: 3; min: 4;

2 9 11 23 36

Anmerkung:

„Diese Implementierung führt nur

Vertauschungen durch. Daher

ist die Reihung sehr gut

geeignet.“

(5)

m a r c – o l i v e r p a h l

resList:

this:

Greedy.InsertionSort (auf Liste)

36 9 11 2 23

public OrderedList insertionSort(){

Comparable first;

OrderedList resList = new OrderedList();

while( head != null ){

first = takeFirst();

resList.insertSorted(first);

}

return resList;

}

9 11 2 23 36

11 2 23

9 36

2 23 9 11 36

23 2 9 11 36

2 9 11 23 36

(6)

m a r c – o l i v e r p a h l

Greedy.BubbleSort (auf Reihung) Comparable[] data;

public void bubbleSort(){

for( int last = data.length-1; last > 0; last- - ) for( int i = 1; i <= last; i++ ){

if ( data[i-1].compareTo( data[i] ) > 0 ) swap( i-1, i);

}

36 9 11 2 23 i: 1; last: 4;

9 36 11 2 23 i: 2; last: 4;

9 11 36 2 23 i: 3; last: 4;

9 11 2 36 23 i: 4; last: 4;

9 11 2 23 36 i: 4; last: 4;

9 11 2 23 36 i: 1; last: 3;

9 11 2 23 36 i: 2; last: 3;

9 2 11 23 36 i: 3; last: 3;

2 9 11 23 36 i: 2; last: 2;

2 9 11 23 36 i: 1; last: 1;

(7)

m a r c – o l i v e r p a h l

D&C.QuickSort (auf Reihung)

Hard Split/ Easy Join:

 Wähle ein Pivot-Element p; (in unserer Implementierung das erste El.)

Teile die Folge ohne p in „<=p“ und „>p“;

 Fahre rekursiv mit den entstandenen Teilmengen fort bis diese einele- mentig sind;

Bentley Split:

private int partition(int left, int right) {

int middle = left ; int pivot = data[left];

for(int i = left + 1; i <= right; i++) {

if (data[i] < pivot) { swap(++middle, i);

} }

swap(left, middle); // Pivot an die richtige Position

return middle; // Position des Pivot }

partition( 0, 4):

11 9 36 2 23

i

middle

11 9 36 2 23

11 9 36 2 23

11 9 36 2 23

11 9 2 36 23

2 9 11 36 23

(8)

m a r c – o l i v e r p a h l

D&C.MergeSort (auf Liste)

Easy Split/ Hard Join:

 Teile die Folge in der Mitte;

Fahre rekursiv mit den entstandenen Teilmengen fort bis diese einele- mentig oder leer sind;

Baue die Listen auf dem Rückweg durch die Rekursion sortiert zusammen.

merge( List a, List b ) {

„Betrachte jeweils das erste Element von a und b und lösche das Kleinere aus seiner Liste und füge es als Nächstes an die neue Liste an.“

}

mergeSort( ) {

„Wenn selbst nicht leer: Teile an (this.length-1) / 2 in aList und bList.“

aList.mergeSort();

bList.mergeSort();

merge( aList, bList );

}

(9)

m a r c – o l i v e r p a h l

D&C.MergeSort (auf Liste)

merge( List a, List b ) {

„Betrachte jeweils das erste Element von a und b und lösche das Kleinere aus seiner Liste und füge es als Nächstes an die neue Liste an.“

} mergeSort( ) {

„Wenn selbst nicht leer: Teile an (this.length-1) / 2 in aList und bList.“

aList.mergeSort();

bList.mergeSort();

merge( aList, bList );

}

36 9 11 2 23

36 9 11 2 23

11 2 23 36 9

2 23

11 2 23

36 9

2

2 2 11 23

9 36

2 9 2 9 11 2 9 11 23 36

9 2 11

2 2 9 11 23

split merge

2 23

(10)

m a r c – o l i v e r p a h l

Zugrunde liegende Datenstruktur

Anhand der unterschiedlichen Struktur der Algorithmen bieten sich auch unterschiedliche Verfahren für unterschiedliche zugrunde-liegende Datenstrukturen an:

Verkettete Liste:

Kein direkter Elementzugriff (-)

Einfügen an beliebiger Stelle möglich, ohne viele Elemente kopieren zu müssen (+)

Daher besonders geeignet für InsertionSort und MergeSort.

Reihung:

Einfügen von Elementen unter Beibehaltung der Sortierung erfordert das Kopieren vieler Elemente (alle nach der Einfügestelle) (-)

 Direkter Element-Zugriff (+)

Daher besonders geeignet für SelectionSort, BubbleSort und QuickSort,

wo es keine Einfügungen gibt.

Referenzen

ÄHNLICHE DOKUMENTE

• Für die Teilmengen, die das i-te Objekt nicht enthalten, ist der Wert der optimalen Lösung gleich V[i-1][w]. • Für die Teilmengen, die Objekt i enthalten, ist der Wert

Tabellieren Sie die Werte, die m , n, q und r von Schleifendurchlauf zu Schlei- fendurchlauf annehmen, wenn der ggT von 15333 und 1235 mit Hilfe des euklidischen Algorithmus

” Spezifizieren“ Sie in Form eines Klassendiagramms (vgl. Sparbuch- Spezifikation der Vorlesung) einen Datentyp Bestellung.

Durch Modifikation einer Eigenschaft oder Hinzuf¨ ugen einer neuen Eigen- schaft kann die implizite Spezifikation so ge¨ andert werden, dass nur noch die Funktion CHS diese erf¨

Schreiben Sie ein Programm, das mit Hilfe des in C++ vordefinierten Datentyps string Zeichenketten vom Benutzer anfordert und sodann nach einem Kontrollausdruck der

Schreiben Sie (in C++) eine erste Version des Datentyps Bestellung (Aufgabe 4 / ¨ Ubungsblatt 3) mit Attributen Kundenname, Kundennummer, Lieferadresse, Rechnungsadresse, (zun¨

• Testen Sie den Zugriff auf eine nicht existierende Komponente eines Vektors. • Warum ist

  Theorie: liefert untere Schranke, die für jeden Algorithmus gilt, der das Problem löst..   Spezieller Algorithmus liefert obere Schranke für die Lösung des