Horst: Habs gefunden

Beitrag lesen

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;
}