Dein Fehler befindet sich in der zweiten for Schleife. Wir gehen deinen Code mal Schritt für Schritt durch
int min = i;
Hier haben wir im ersten Durchlauf i=0, also ist hier min=0 und i=0 Jetzt geht es in die zweite for schleife
Begonnen wird mit
j = i + 1 = 1
Damit ist
a[j]=a[1]=2 und a[min]=a[0]=51
Die Bedingung ist erfüllt, es wird min = 1 gesetzt. Du hast korrekterweise detektiert dass die zweite Zahl kleiner ist als die ersten du tauscht 51 und 2
und dein Array sieht so aus:
2, 51, 3, 4, ...
Zweiter Durchlauf der Schleife:
j=2
Hier ist jetzt dein Fehler. Im vorherigen Durchlauf wurde min = 1 gesetzt, du vergleichst also nicht mehr mit der ersten Zahl (die die bis jetzt kleinste ist), sondern mit der zweiten, und die ist 51. Deine if Bedingung ist:
a[2] < a[1] und das wird wieder true, denn 3 < 51.
Damit wird min = 2
Jetzt tauscht du wieder die Elemente mit Index min=2 und i. i ist aber weiterhin 0 weil wir noch im ersten Durchlauf der ersten Schleife sind. Du tauscht jetzt also 2 und 3. Dein neues Array ist dann
3, 51, 2, 4, ...
Also ab hier wird alles falsch.
Das kannst du jetzt entweder korriegeren, oder deinen Algorithmus insgesamt überdenken. Ich würde dir empfehlen nicht direkt zu tauschen, sondern immer erst nachdem du einmal das ganze Array durchsucht hast. Dazu erstmal nur den Index mit der kleinsten Zahl speichern, und dann final tauschen. Ist meiner Meinung nach etwas einfacher zum Denken. Aber das musst du selbst wissen. Ob es da ne wirkliche Definition gibt wann es noch so ein Selection Sort ist weiß ich nicht, vielleicht ist es nicht erlaubt die ganze Zeit zu tauschen. Ich kenne min sort so: Erst Minimum im rechten Teilarraysuchen, dann tauschen, dann index einen weiter schieben...
Punkte: 160
Dankeschön, habs jetzt korrigiert und es funktioniert wieder so, wie es soll :)
─ throwaway.9 31.05.2022 um 17:02