• Keine Ergebnisse gefunden

Datenstrukturen und Algorithmen Vorlesung 9: Quicksort (K7) Joost-Pieter Katoen

N/A
N/A
Protected

Academic year: 2022

Aktie "Datenstrukturen und Algorithmen Vorlesung 9: Quicksort (K7) Joost-Pieter Katoen"

Copied!
289
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Datenstrukturen und Algorithmen

Vorlesung 9: Quicksort (K7)

Joost-Pieter Katoen

Lehrstuhl für Informatik 2 Software Modeling and Verification Group

https://moves.rwth-aachen.de/teaching/ss-18/dsal/

18. Mai 2018

Joost-Pieter Katoen Datenstrukturen und Algorithmen 1/27

(2)

1 Quicksort

Das Divide-and-Conquer Paradigma Partitionierung

Quicksort Algorithmus Komplexitätsanalyse

2 Weitere Sortierverfahren Bubblesort

Countingsort

3 Vergleich der Sortieralgorithmen

Joost-Pieter Katoen Datenstrukturen und Algorithmen 2/27

(3)

1 Quicksort

Das Divide-and-Conquer Paradigma Partitionierung

Quicksort Algorithmus Komplexitätsanalyse

2 Weitere Sortierverfahren Bubblesort

Countingsort

3 Vergleich der Sortieralgorithmen

Joost-Pieter Katoen Datenstrukturen und Algorithmen 3/27

(4)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Rekursionsebene:

Teile das Problem in eine Anzahl von Teilproblemen auf.

Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Beispiel: Mergesort (s. Vorlesung 7).

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(5)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Beispiel: Mergesort (s. Vorlesung 7).

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(6)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Beispiel: Mergesort (s. Vorlesung 7).

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(7)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Teile das Problem in eine Anzahl von Teilproblemen auf.

Ausgangsproblems. Beispiel: Mergesort (s. Vorlesung 7).

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(8)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Teile das Problem in eine Anzahl von Teilproblemen auf.

Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(9)

Quicksort Quicksort

Divide-and-Conquer

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Teile das Problem in eine Anzahl von Teilproblemen auf.

Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(10)

Teile-und-BeherrscheAlgorithmen (divide and conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Sie lösen die Teilprobleme rekursivund kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Teile das Problem in eine Anzahl von Teilproblemen auf.

Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Beispiel: Mergesort (s. Vorlesung 7).

Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/27

(11)

Quicksort Quicksort

Quicksort – Idee

Mergesort sortiert zunächst rekursiv, danach verteilt er sozusagen die Elemente an die richtigen Stellen.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/27

(12)

Quicksort Quicksort

Quicksort – Idee

Mergesort sortiert zunächst rekursiv, danach verteilt er sozusagen die Elemente an die richtigen Stellen.

Bei Quicksortwerden die Elemente zuerst auf die richtige Seite („Hälfte“) des Arrays gebracht, dann wird jeweils rekursiv sortiert.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/27

(13)

Mergesort sortiert zunächst rekursiv, danach verteilt er sozusagen die Elemente an die richtigen Stellen.

Bei Quicksortwerden die Elemente zuerst auf die richtige Seite („Hälfte“) des Arrays gebracht, dann wird jeweils rekursiv sortiert.

Quicksort wurde 1961 von Tony Hoare (Großbritannien) entwickelt.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/27

(14)

Quicksort Quicksort

Quicksort – Strategie

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

2. mindestens so groß wie das Pivotelement.

Beherrsche: Sortiere die Teile rekursiv und setze dann das Pivotelement zwischen die sortierten Teile.

Verbinde: Da die Teilfelder in-place sortiert werden ist keine Arbeit nötig, um sie zu verbinden.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(15)

Quicksort Quicksort

Quicksort – Strategie

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

Teile Wähle ein Pivotelementaus dem zu sortierenden Array

Beherrsche: Sortiere die Teile rekursiv und setze dann das Pivotelement zwischen die sortierten Teile.

Verbinde: Da die Teilfelder in-place sortiert werden ist keine Arbeit nötig, um sie zu verbinden.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(16)

Quicksort Quicksort

Quicksort – Strategie

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

Teile Wähle ein Pivotelementaus dem zu sortierenden Array und partitioniere das zu sortierende Array in zwei Teile auf:

zwischen die sortierten Teile.

Verbinde: Da die Teilfelder in-place sortiert werden ist keine Arbeit nötig, um sie zu verbinden.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(17)

Quicksort Quicksort

Quicksort – Strategie

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

Teile Wähle ein Pivotelementaus dem zu sortierenden Array und partitioniere das zu sortierende Array in zwei Teile auf:

1. Kleinerals das Pivotelement, sowie 2. mindestens so groß wie das Pivotelement.

nötig, um sie zu verbinden.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(18)

Quicksort Quicksort

Quicksort – Strategie

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

Teile Wähle ein Pivotelementaus dem zu sortierenden Array und partitioniere das zu sortierende Array in zwei Teile auf:

1. Kleinerals das Pivotelement, sowie 2. mindestens so groß wie das Pivotelement.

Beherrsche: Sortiere die Teile rekursiv und setze dann das Pivotelement zwischen die sortierten Teile.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(19)

41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

8 3 6 12 4 2 13 0 17 41 26 17 69 25 19 34 Pivot Partitionierung

<Pivot >Pivot

Teile Wähle ein Pivotelementaus dem zu sortierenden Array und partitioniere das zu sortierende Array in zwei Teile auf:

1. Kleinerals das Pivotelement, sowie 2. mindestens so groß wie das Pivotelement.

Beherrsche: Sortiere die Teile rekursiv und setze dann das Pivotelement zwischen die sortierten Teile.

Verbinde: Da die Teilfelder in-place sortiert werden ist keine Arbeit nötig, um sie zu verbinden.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/27

(20)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

I Fahre fort, bis sich die Grenzen treffen. (Es gibt auch andere Verfahren.)

Das obige Schema ist ähnlich zu Dijkstra’s DutchNationalFlag Problem.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(21)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

I Fahre fort, bis sich die Grenzen treffen. (Es gibt auch andere Verfahren.)

Das obige Schema ist ähnlich zu Dijkstra’s DutchNationalFlag Problem.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(22)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Fahre fort, bis sich die Grenzen treffen. (Es gibt auch andere Verfahren.)

Das obige Schema ist ähnlich zu Dijkstra’s DutchNationalFlag Problem.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(23)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

Das obige Schema ist ähnlich zu Dijkstra’s DutchNationalFlag Problem.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(24)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(25)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

I Fahre fort, bis sich die Grenzen treffen.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(26)

Quicksort Quicksort

Partitionierung (I)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

I Fahre fort, bis sich die Grenzen treffen.

(Es gibt auch andere Verfahren.)

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(27)

Sobald ein Pivot ausgewählt ist, kann das Array inO(n) partitioniert werden, z. B. folgendermaßen:

I Arbeite mit drei Bereichen: „<Pivot“, „>Pivot“ und „ungeprüft“.

I Schiebe die linke Grenze nach rechts, solange das zusätzliche Element

<Pivot ist.

I Schiebe die rechte Grenze nach links, solange das zusätzliche Element

>Pivot ist.

I Tausche das links gefundene mit dem rechts gefundenen Element.

I Fahre fort, bis sich die Grenzen treffen.

(Es gibt auch andere Verfahren.)

Das obige Schema ist ähnlich zu Dijkstra’s DutchNationalFlag Problem.

Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/27

(28)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17 Suche

<Pivot >Pivot

left right

left right

Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/27

(29)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

8 6 12 25 19 0 4 3 13 2 17 26 69 41 34 17 Suche

Tausch

<Pivot >Pivot

<Pivot >Pivot

left right

left right

left right

Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/27

(30)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

8 6 12 25 19 0 4 3 13 2 17 26 69 41 34 17 Suche

Tausch

Suche

<Pivot >Pivot

<Pivot >Pivot

left right

left right

left right

Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/27

(31)

1int partition(int E[], int left, int right) {

2 // Wähle einfaches Pivotelement

3 int ppos = right, pivot = E[ppos];

4 while (true) {

5 // Bilineare Suche

6 while (left < right && E[left] < pivot) left++;

7 while (left < right && E[right] >= pivot) right--;

8 if (left >= right) {

9 break;

10 }

11 swap(E[left], E[right]);

12 }

13 swap(E[left], E[ppos]);

14 return left; // gib neue Pivotposition als Splitpunkt zurück

15}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/27

(32)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(33)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(34)

8 6 17 25 19 0 4 3 13 2 12 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(35)

8 6 12 25 19 0 4 3 13 2 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(36)

8 6 12 25 19 0 4 3 13 2 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(37)

8 6 12 2 19 0 4 3 13 25 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(38)

8 6 12 2 19 0 4 3 13 25 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(39)

8 6 12 2 13 0 4 3 19 25 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(40)

8 6 12 2 13 0 4 3 19 25 17 26 69 41 34 17

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(41)

8 6 12 2 13 0 4 3 17 25 17 26 69 41 34 19

left right

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(42)

8 6 12 2 13 0 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(43)

8 6 12 2 13 0 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(44)

8 6 12 2 13 0 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(45)

0 6 12 2 13 8 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(46)

0 6 12 2 13 8 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(47)

0 2 12 6 13 8 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(48)

0 2 12 6 13 8 4 3 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(49)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(50)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(51)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(52)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(53)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(54)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(55)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right

0 1

2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(56)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right 0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(57)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right 0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(58)

0 2 3 6 13 8 4 12 17 25 17 26 69 41 34 19

left right 0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(59)

0 2 3 6 4 8 13 12 17 25 17 26 69 41 34 19

left right 0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(60)

0 2 3 6 4 8 13 12 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(61)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(62)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right 0

1 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(63)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right 0

1 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(64)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(65)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(66)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(67)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(68)

0 2 3 6 4 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(69)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(70)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 4 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(71)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 4 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(72)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 3 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(73)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1 2

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(74)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(75)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right

0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(76)

0 2 3 4 6 8 12 13 17 25 17 26 69 41 34 19

left right 0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(77)

0 2 3 4 6 8 12 13 17 17 25 26 69 41 34 19

left right 0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(78)

0 2 3 4 6 8 12 13 17 17 25 26 69 41 34 19

left right 0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(79)

0 2 3 4 6 8 12 13 17 17 19 26 69 41 34 25

left right 0

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(80)

0 2 3 4 6 8 12 13 17 17 19 26 69 41 34 25

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

(81)

0 2 3 4 6 8 12 13 17 17 19 26 69 41 34 25

left right

0 1

1void quickSort(int E[], int left, int right) {

2 if (left < right) {

3 int i = partition(E, left, right);

4 // i ist Position des Split-punktes (Pivot)

5 quickSort(E, left, i - 1); // sortiere den linken Teil

6 quickSort(E, i + 1, right); // sortiere den rechten Teil

7 }

8}

Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/27

Referenzen

ÄHNLICHE DOKUMENTE

I Element getMin(PriorityQueue pq) gibt das Element mit dem kleinsten Schlüssel zurück; benötigt nicht-leere pq. I void delMin(PriorityQueue pq) entfernt das Element mit dem

I Die Partitionierung hat eine lineare Zeitkomplexität, d. eine Zerlegung im Verhältnis 9:1. alle Elemente im zu sortierenden Array E sind unterschiedlich 3.. Quicksort

I Ein AVL-Baum ist ein balancierter BST, bei dem für jeden Knoten die Höhe der beiden Teilbäume höchstens um 1 differiert. I Bei AVL-Bäumen wird die Höhe der Teilbäume der

I Färben wir ihn aber rot, dann könnten wir eine Verletzung der Farbbedingungen bekommen (die Wurzel ist schwarz, rote Knoten haben keine roten Kinder).. ⇒ Wir färben den Knoten rot

2 Offene Adressierung Lineares Sondieren Quadratisches Sondieren Doppeltes Hashing.. Effizienz der

I Die Priorität eines Randknotens muss nach jeder gefundenen Kante angepasst werden. Bei einem Graph mit n Knoten und m Kanten

Wir werden zeigen, dass ein Fluss in G genau dann maximal ist, wenn sein Restnetzwerk keine augmentierende Pfade enthält. Dazu benutzen

Die Worst-Case-Laufzeit ist abhängig vom Wert eines maximalen Flusses, da der Wert des Flusses im schlimmsten Fall sich jeweils nur um eine Einheit erhöht. Joost-Pieter