• Keine Ergebnisse gefunden

7 Anwendung: Sortieren

N/A
N/A
Protected

Academic year: 2022

Aktie "7 Anwendung: Sortieren"

Copied!
35
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

7 Anwendung: Sortieren

Gegeben: eine Folge von ganzen Zahlen.

Gesucht: die zugehörige aufsteigend sortierte Folge.

Idee:

ñ speichere die Folge in einem Feld ab;

ñ lege ein weiteres Feld an;

ñ füge der Reihe nach jedes Element des ersten Felds an der richtigen Stelle in das zweite Feld ein!

=⇒Sortieren durch Einfügen (InsertionSort)

Harald Räcke 161/656

(2)

7 Anwendung: Sortieren

1 public static int[] sort(int[] a) {

2 int n = a.length;

3 int[] b = new int[n];

4 for (int i = 0; i < n; ++i)

5 insertinsert(b, a[i], i);

6 // b = Feld, in das eingefuegt wird

7 // a[i] = einzufuegendes Element

8 // i = Anzahl von Elementen in b

9 return b;

10 } // end of sort ()

Sortieren durch Einfügen

Teilproblem: wie fügt man ein?

7 Anwendung: Sortieren

Harald Räcke 162/656

7 Anwendung: Sortieren

Gegeben: eine Folge von ganzen Zahlen.

Gesucht: die zugehörige aufsteigend sortierte Folge.

Idee:

ñ speichere die Folge in einem Feld ab;

ñ lege ein weiteres Feld an;

ñ füge der Reihe nach jedes Element des ersten Felds an der richtigen Stelle in das zweite Feld ein!

=⇒Sortieren durch Einfügen (InsertionSort)

7 Anwendung: Sortieren

Harald Räcke 161

(3)

Beispiel

17 3 -2 9 0 1 7 42 5

7 Anwendung: Sortieren

Harald Räcke 163/656

(4)

Beispiel

17 3 -2 9 0 1 7 42 5

7 Anwendung: Sortieren

Harald Räcke 163/656

(5)

Beispiel

17 3 -2 9 0 1 7 42 5

7 Anwendung: Sortieren

Harald Räcke 163/656

(6)

Beispiel

17 3 -2 9 0 1 7 42 5

17

7 Anwendung: Sortieren

Harald Räcke 163/656

(7)

Beispiel

17 3 -2 9 0 1 7 42 5

17

7 Anwendung: Sortieren

Harald Räcke 163/656

(8)

Beispiel

17 3 -2 9 0 1 7 42 5

17

7 Anwendung: Sortieren

Harald Räcke 163/656

(9)

Beispiel

17 3 -2 9 0 1 7 42 5

17

7 Anwendung: Sortieren

Harald Räcke 163/656

(10)

Beispiel

17 3 -2 9 0 1 7 42 5

3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(11)

Beispiel

17 3 -2 9 0 1 7 42 5

3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(12)

Beispiel

17 3 -2 9 0 1 7 42 5

3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(13)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(14)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(15)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(16)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(17)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(18)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(19)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(20)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(21)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(22)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(23)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(24)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(25)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 7 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(26)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 7 9 17

7 Anwendung: Sortieren

Harald Räcke 163/656

(27)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 7 9 17 42

7 Anwendung: Sortieren

Harald Räcke 163/656

(28)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 7 9 17 42

7 Anwendung: Sortieren

Harald Räcke 163/656

(29)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 7 9 17 42

7 Anwendung: Sortieren

Harald Räcke 163/656

(30)

Beispiel

17 3 -2 9 0 1 7 42 5

-2 0 1 3 5 7 9 17 42

7 Anwendung: Sortieren

Harald Räcke 163/656

(31)

7 Anwendung: Sortieren

1 public static void insert(int[] b, int x, int i) {

2 // finde Einfuegestelle j fuer x in b

3 int j = locatelocate(b,x,i);

4 // verschiebe in b Elemente b[j],...,b[i-1]

5 // nach rechts

6 shiftshift(b,j,i);

7 b[j] = x;

8 }

Einfügen

ñ Wie findet man Einfügestelle?

ñ Wie verschiebt man nach rechts?

7 Anwendung: Sortieren

Harald Räcke 164/656

(32)

7 Anwendung: Sortieren

public static int locate(int[] b, int x, int i) { int j = 0;

while (j < i && x > b[j]) ++j;

return j;

}

public static void shift(int[] b, int j, int i) { for (int k = i-1; k >= j; --k)

b[k+1] = b[k];

}

ñ Warum läuft Iteration inshift()voni-1abwärtsnachj?

7 Anwendung: Sortieren

Harald Räcke 165/656

7 Anwendung: Sortieren

1 public static void insert(int[] b, int x, int i) {

2 // finde Einfuegestelle j fuer x in b

3 int j = locatelocate(b,x,i);

4 // verschiebe in b Elemente b[j],...,b[i-1]

5 // nach rechts

6 shiftshift(b,j,i);

7 b[j] = x;

8 }

Einfügen

ñ Wie findet man Einfügestelle?

ñ Wie verschiebt man nach rechts?

7 Anwendung: Sortieren

Harald Räcke 164

(33)

7 Anwendung: Sortieren

Erläuterungen

ñ Das Feldbist (ursprünglich)lokaleVariable vonsort().

ñ Lokale Variablen sind nur im eigenen Funktionsrumpf sichtbar, nicht in den aufgerufenen Funktionen.

ñ Damit die aufgerufenen Hilfsfunktionen aufbzugreifen können, mussbexplizit als Parameter übergeben werden!

Achtung:

Das Feld wird nicht kopiert. Das Argument ist der Wert der Variablenb, also nur eineReferenz!

ñ Deshalb benötigen wederinsert(), nochshift()einen separaten Rückgabewert. . .

ñ Weil das Problem so klein ist, würde eineerfahrene Programmiererin hier keine Unterprogramme benutzen...

7 Anwendung: Sortieren

public static int locate(int[] b, int x, int i) { int j = 0;

while (j < i && x > b[j]) ++j;

return j;

}

public static void shift(int[] b, int j, int i) { for (int k = i-1; k >= j; --k)

b[k+1] = b[k];

}

ñ Warum läuft Iteration inshift()voni-1abwärtsnachj?

(34)

7 Anwendung: Sortieren

1 public static int[] sort(int[] a) {

2 int[] b = new int[a.length];

3 for (int i = 0; i < a.length; ++i) {

4 // begin of insert

5 int j = 0;

6 while (j < i && a[i] > b[j]) ++j;

7 // end of locate

8 for (int k = i-1; k >= j; --k)

9 b[k+1] = b[k];

10 // end of shift

11 b[j] = a[i];

12 // end of insert

13 }

14 return b;

15 } // end of sort

7 Anwendung: Sortieren

Harald Räcke 167/656

7 Anwendung: Sortieren

Erläuterungen

ñ Das Feldbist (ursprünglich)lokaleVariable vonsort().

ñ Lokale Variablen sind nur im eigenen Funktionsrumpf sichtbar, nicht in den aufgerufenen Funktionen.

ñ Damit die aufgerufenen Hilfsfunktionen aufbzugreifen können, mussbexplizit als Parameter übergeben werden!

Achtung:

Das Feld wird nicht kopiert. Das Argument ist der Wert der Variablenb, also nur eineReferenz!

ñ Deshalb benötigen wederinsert(), nochshift()einen separaten Rückgabewert. . .

ñ Weil das Problem so klein ist, würde eineerfahrene Programmiererin hier keine Unterprogramme benutzen...

(35)

7 Anwendung: Sortieren

Diskussion

ñ Die Anzahl der ausgeführten Operationen wächst quadratisch in der Größe des Feldsa.

ñ Glücklicherweise gibt es Sortierverfahren, die eine bessere Laufzeit haben (Algorithmen und Datenstrukturen).

7 Anwendung: Sortieren

Harald Räcke 168/656

7 Anwendung: Sortieren

1 public static int[] sort(int[] a) {

2 int[] b = new int[a.length];

3 for (int i = 0; i < a.length; ++i) {

4 // begin of insert

5 int j = 0;

6 while (j < i && a[i] > b[j]) ++j;

7 // end of locate

8 for (int k = i-1; k >= j; --k)

9 b[k+1] = b[k];

10 // end of shift

11 b[j] = a[i];

12 // end of insert

13 }

14 return b;

15 } // end of sort

7 Anwendung: Sortieren

Harald Räcke 167

Referenzen

ÄHNLICHE DOKUMENTE

[r]

[r]

W¨ ahlen Sie h dazu so, daß Sie 3 Schritte

[r]

b) Angenommen, ein Auswahlgenerator gibt allen Stichproben aus Teilauf- gabe a) die

Um diese Programme auf mehreren Rechnern im CIP-Pool zu starten, sollten Sie als erstes eine Datei mit den Namen der Rechner erzeugen, die an der Rechnung beteiligt sein sollen.. Dazu

• Lokale Variablen sind nur im eigenen Funktionsrumpf sichtbar, nicht in den aufgerufenen Funktionen.. • Damit die aufgerufenen Hilfsfunktionen auf b zugreifen können, muss b

Escriba un valor (%) para el tamaño de copia con los botones numéricos (consulte “Cómo utilizar los botones numéricos” de la página 27) o pulse el botón Seleccionar l / r