hi Vinzenz,
Das ganze Geheimnis besteht in folgender Anweisung (hier in Perl, auch wenn ich mit c immer besser klarkomme, manchmal teste ich meine Funktionen zuerst in Perl):
posmax ist posmin, wenn max auf start stand
if($posmax == $start){$posmax = $posmin;}
könntest Du bitte erläutern, was diese Anweisung hier mit Deiner Fragestellung zu tun hat? Ich kann keinen Zusammenhang erkennen.
Gerne ;-)
Gaaanz von vorn:
gegeben sind:
min, posmin
max, posmax
min, max sind Ganzzahlen
posmin, posmax sind die Positionen von min, max in einem ZahlenArray [0], [1],...[n]
min soll auf die Position [start] und max auf die Position [ende] geschrieben werden. Wie kriege ich das ohne Datenverlust hin? ....
Also: Wenn ich min nach [start] schreibe, die Zahl, die auf [start] stand an posmin, passt alles noch.
Wenn ich danach jedoch das max nach [ende] schreibe und das was auf [ende] stand an posmax, krachts in dem Fall wo das max auf [start] stand. Hierbei wird [start], wo ich schon das min habe überschrieben.
Deswegen ist genau das zu prüfen:
if(posmax == start){posmax = posmin;}
Viele Grüße,
Hotte
Hier alles zusammen in c. Praktisch ein erweiterter Selection-Sort. Die Funktion wird nicht rekursiv, sondern iterativ aufgerufen. Das Array wird praktisch nur noch halbsovielmal durchlaufen.
/*************************************************************************/
// wie nSort, hier jedoch wird min UND max ermittelt, also performater
// keine Rekursion, Funktion muss iterativ aufgerufen werden!
void xSort(int * p, int start, int stop){
int min = 2147483647; // oder 0xFFFFFFFF
int max = -2147483647; // oder 0
int posmin;
int posmax;
int i;
for(i = start; i < stop; i++){
if( p[i] < min ) {
min = p[i];
posmin = i;
}
if( p[i] > max ) {
max = p[i];
posmax = i;
}
}
// nun die Zahlen auf den richtigen Positionen ablegen
// merke wert auf p[start]
int wsta = p[start];
p[start] = min;
p[posmin] = wsta;
// posmax ist posmin, wenn max auf start stand
if(posmax == start){posmax = posmin;}
// merke wert auf p[stop-1]
int wsto = p[stop-1];
p[stop-1] = max;
p[posmax] = wsto;
}
/*************************************************************************/
int main(){
int i;
int zn[] = {1,2,3,4,5,0,-1,-2};
int size = sizeof(zn)/sizeof(int);
printf("zn hat %d Zahlen\n", size);
// iteration über xSort
for(i = 0; i < size - i; i++){
xSort(zn, i, size - i);
}
for(i = 0; i < size; i++){
printf ("%d\n", zn[i]);
}
return 0;
}