Bestellungen nach Uhrzeit
AFB I–IIEin Online-Shop erhält Bestellungen aus mehreren Lagern; die Eingangszeiten (in Minuten nach Öffnung) kommen ungeordnet an. Bevor die Bestellungen bearbeitet werden, sortiert die Software die Reihung zeit aufsteigend mit Insertionsort.
- Beschreiben Sie das Prinzip von Insertionsort.
- Stellen Sie Insertionsort als Struktogramm dar (Zwischenspeicher
x, Laufindexj). - Wenden Sie Ihr Verfahren auf die Reihung
zeitan: Geben Sie für jede Rundex, die Anzahl der Verschiebungen und Vergleiche sowie die Reihung danach in einer Tabelle an, und nennen Sie die Summen.
Hinweise
Hinweis zu Aufgabe a)
Hinweis zu Aufgabe b)
Hinweis zu Aufgabe c)
j = -1 endet sie ohne Vergleich.Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
Die Reihung wird in einen sortierten Teil (links, anfangs nur das erste Element) und einen unsortierten Teil geteilt. In jeder Runde wird das erste Element des unsortierten Teils zwischengespeichert. Von rechts nach links rücken alle Elemente des sortierten Teils, die größer sind, um einen Platz nach rechts; in die entstandene Lücke wird das gespeicherte Element eingefügt. Nach \(n-1\) Runden ist alles sortiert.
Erwartungshorizont zu Aufgabe b)
Wichtig: Bedingung j ≥ 0 vor dem Zugriff auf a[j]; Einfügen erst nach der Schleife.
Erwartungshorizont zu Aufgabe c)
| i | x | Verschiebungen | Vergleiche | zeit danach |
|---|---|---|---|---|
| 1 | 40 | 1 | 1 | 40 95 | 130 25 70 110 |
| 2 | 130 | 0 | 1 | 40 95 130 | 25 70 110 |
| 3 | 25 | 3 | 3 | 25 40 95 130 | 70 110 |
| 4 | 70 | 2 | 3 | 25 40 70 95 130 | 110 |
| 5 | 110 | 1 | 2 | 25 40 70 95 110 130 |
Summe: 10 Vergleiche und 7 Verschiebungen (zum Vergleich: Selectionsort bräuchte 15 Vergleiche).
Eine Rangliste, die sortiert bleibt
AFB II–IIIEin Online-Spiel führt eine Rangliste. Die Punktzahlen stehen in einer Reihung punkte der Länge 1000; belegt sind die ersten anzahl Plätze, und zwar aufsteigend sortiert. Jeder neue Punktestand wird mit folgendem Verfahren eingetragen:
- Es gilt
anzahl = 5undpunktebeginnt mit120, 145, 170, 210, 260. Ein neuer Wert150wird eingetragen. Analysieren Sie das Verfahren an diesem Beispiel: Geben Sie die Anzahl der Vergleiche und Verschiebungen, die belegten Plätze danach und den Rückgabewert an, und kennzeichnen Sie, für welche neuen Werte der Aufwand am größten ist. - Implementieren Sie das Verfahren als Java-Methode
public static int einfuegen(int[] punkte, int anzahl, int wert). Ist die Reihung schon voll, soll nichts verändert undanzahlzurückgegeben werden. - Täglich kommen 10 000 neue Punktestände hinzu, die Liste enthält etwa 1000 Einträge. Variante A hängt jeden Wert hinten an und sortiert die ganze Liste mit Selectionsort neu, Variante B benutzt
einfuegen. Schätzen Sie die Anzahl der Vergleiche pro Tag für beide Varianten ab. - Mit der Bedingung
punkte[j] > wertlandet ein neuer Punktestand hinter gleich hohen älteren Einträgen, also in der aufsteigenden Liste auf einem höheren Rang. Ein Spieler fordert, dass bei Gleichstand der ältere Eintrag den höheren Rang behalten soll, und schlägt>=vor. Erörtern Sie diesen Vorschlag.
Hinweise
Hinweis zu Aufgabe a)
j und punkte[j]; der Rückgabewert ist die neue Anzahl belegter Plätze.Hinweis zu Aufgabe b)
anzahl == punkte.length.Hinweis zu Aufgabe c)
einfuegen: höchstens anzahl Vergleiche.Hinweis zu Aufgabe d)
>, wo mit >=? Was kostet die Änderung, was bewirkt sie?Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| j | punkte[j] | punkte[j] > 150? | Aktion |
|---|---|---|---|
| 4 | 260 | ja | punkte[5] ← 260 |
| 3 | 210 | ja | punkte[4] ← 210 |
| 2 | 170 | ja | punkte[3] ← 170 |
| 1 | 145 | nein | Schleife endet |
4 Vergleiche, 3 Verschiebungen; punkte[2] ← 150. Belegt: 120, 145, 150, 170, 210, 260; Rückgabe 6. Am größten ist der Aufwand für Werte, die kleiner als alle vorhandenen sind: Dann rücken alle anzahl Einträge, es gibt anzahl Vergleiche. Ist der Wert mindestens so groß wie der letzte, genügt ein Vergleich.
Erwartungshorizont zu Aufgabe b)
public static int einfuegen(int[] punkte, int anzahl, int wert) {
if (anzahl == punkte.length) {
return anzahl; // Liste voll
}
int j = anzahl - 1;
while (j >= 0 && punkte[j] > wert) {
punkte[j + 1] = punkte[j];
j--;
}
punkte[j + 1] = wert;
return anzahl + 1;
}Bewertet werden: Behandlung der vollen Reihung, Reihenfolge der Teilbedingungen, Verschieben nach rechts, Einfügen nach der Schleife, Rückgabe der neuen Anzahl.
Erwartungshorizont zu Aufgabe c)
Variante A: je Wert \(\frac{1000\cdot999}{2}\approx5\cdot10^{5}\) Vergleiche, pro Tag \(\approx10\,000\cdot5\cdot10^{5}=5\cdot10^{9}\). Variante B: je Wert höchstens 1000 Vergleiche, pro Tag höchstens \(10^{7}\). Variante B ist mindestens etwa 500-mal sparsamer; im Mittel (neuer Wert in der Mitte) sogar etwa 1000-mal.
Erwartungshorizont zu Aufgabe d)
Pro: Mit >= rücken auch gleich hohe Einträge nach rechts, der neue Wert landet vor ihnen — bei Gleichstand behält der ältere Eintrag den höheren Rang, wie gefordert. Das entspricht dem üblichen Fairnessprinzip „wer zuerst da war“. Contra: Bei vielen gleichen Punktzahlen entstehen zusätzliche Verschiebungen (Aufwand steigt, im Extremfall alle Einträge). Die bisherige Variante ist das stabile Einfügen; die neue ist aber ebenfalls eindeutig und konsistent, solange sie überall gleich verwendet wird. Alternativ könnte man einen Zeitstempel als zweites Kriterium speichern. Fazit (begründet, z. B.): Der Vorschlag erfüllt die Anforderung mit geringem Mehraufwand und ist zu übernehmen.
