studyklar
GdI 1 · Übungsblatt 8 · Aufgabe 1

Sortieren durch Vertauschen: ein Array auf- und absteigend sortieren

Ein Array ist eine Reihe von Werten unter einem Namen, mit nummerierten Plätzen. Hier soll ein Programm die Zahlen eines Arrays der Größe nach ordnen. Es vergleicht immer zwei Nachbarn und vertauscht sie, wenn sie falsch herum stehen. Rechts steht das Array nach jedem Durchlauf. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 8.1

a) Schreiben Sie ein Programm A8_1a, das die Elemente eines Integer-Arrays a der Größe nach aufsteigend sortiert! Verwenden Sie den Algorithmus „Sortieren durch Vertauschen“, wie er in der Vorlesung besprochen wurde.

b) Variieren Sie das Programm A8_1a derart (neuer Name: A8_1b), dass die Zahlen absteigend sortiert werden.

Hinweis: Der einfachste Ansatz wäre, das Array gemäß Teilaufgabe a) aufsteigend zu sortieren und anschließend zu spiegeln. Im Rahmen der vorliegenden Aufgabe sollen Sie allerdings den Sortieralgorithmus im Kern anpassen.

Gegeben ist ein Array mit ganzen Zahlen. Das Programm soll die Zahlen so umstellen, dass sie in a) von klein nach groß und in b) von groß nach klein dastehen. Welche Zahlen im Array stehen, sagt die Aufgabe nicht. Wir nehmen das Beispiel der Vorlesung, Folie 5-64: 23 14 45 7 31 16.

Welches Verfahren? Das Skript zeigt auf Folie 5-64 nur die Aufgabe und den Methodenkopf, nicht den Algorithmus. Unter dem Namen „Sortieren durch Vertauschen“ laufen zwei Varianten: Entweder vergleicht man immer zwei benachbarte Zahlen (auch Bubblesort genannt, englisch bubble = Blase), oder man vergleicht Platz i mit allen späteren Plätzen. Wir nehmen die Nachbarn; die andere Variante ist ebenso richtig.

Merke: Sortiert wird nur durch Vergleichen und Vertauschen zweier Nachbarn, so lange, bis kein Paar mehr falsch herum steht.
  1. Das Array anlegen.
  2. Zwei Nachbarn vergleichen.
  3. Zwei Werte vertauschen, mit einer Hilfsvariablen.
  4. Ein ganzer Durchlauf mit einer Schleife.
  5. Weitere Durchläufe mit einer zweiten, äußeren Schleife.
  6. Ausgeben und laufen lassen.
  7. b) Für absteigend nur den Vergleich umdrehen.

Das Array anlegen

public class A8_1a {     public static void main(String[] args) {        int[] a = {23, 14, 45, 7, 31, 16};
    }}
Platz012345
a[Platz]23144573116

int[] a ist ein Array aus ganzen Zahlen (int) mit dem Namen a, so wie die Aufgabe es nennt. Die geschweiften Klammern legen es gleich mit seinen sechs Werten an. Die Plätze sind ab 0 nummeriert: Auf Platz 0 steht 23, auf Platz 5 steht 16.

a[0] ist der Wert auf Platz 0, a.length die Zahl der Plätze, hier 6. Der letzte Platz ist darum a.length - 1 = 5.

Aus Skript 5, Folien 5-7 und 5-9 („Arbeiten mit Arrays“, „Array-Initialisierung“): int[] primes = {2, 3, 5, 7, 11}; legt ein Array mit fünf Werten an. Ein Index unter 0 oder ab a.length führt zu einem Laufzeitfehler.
Aus Aufgabe 7.1 („Array rückwärts ausgeben: erst Tastatur, dann Datei“): Dort wurde ein Array angelegt und mit einer for-Schleife Platz für Platz durchlaufen; a[i] ist der Wert auf Platz i.

Zwei Nachbarn vergleichen

                if (a[j] > a[j + 1]) {
                }

Aufsteigend sortiert heißt: Jede Zahl ist höchstens so groß wie ihr rechter Nachbar. Ein Paar steht also falsch herum, wenn die linke Zahl größer ist als die rechte. Genau das prüft die Bedingung a[j] > a[j + 1].

j ist die Platznummer der linken Zahl, j + 1 die ihres rechten Nachbarn. Für das erste Paar ist j = 0: a[0] = 23 und a[1] = 14. 23 > 14 ist wahr, die beiden müssen die Plätze tauschen. Woher j seine Werte bekommt, zeigt Schritt 4.

Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1a) Aufsteigend sortieren

Nachbarn vergleichen und vertauschen

Platz
012345
Start
23
14
45
7
31
16
nach Durchlauf 1
?
?
?
?
?
?
nach Durchlauf 2
?
?
?
?
?
?
nach Durchlauf 3
?
?
?
?
?
?
nach Durchlauf 4
?
?
?
?
?
?
nach Durchlauf 5
?
?
?
?
?
?
LegendePlatz steht festverglichenes PaarDas Array nach jedem Durchlauf.