Schwierige Sortierung eines Arrays



  • Hi,
    ich habe ein Array ArrayErg sortiert.
    Es hat die Einträge zB: (0, 0, 0, 100, 100, 100, 300, 400, 500)
    Jetzt will ich den Eintrag nach der 0 haben, in diesem Fall die '100'. Das geschieht im folgenden Code:

    zzz=0; 
    while (arrayErg2[zzz].val==0)
    	++zzz; 
    e2=arrayErg2[zzz].key;
    e3=arrayErg2[zzz].val;
    

    Jetzt habe ich aber das Problem, dass nicht der letzte minimale Eintrag außerhalb der 0 ausgegeben wird. Wie ist dieses zu erhalten?
    Ich will somit die 6. Stelle ausgegeben bekommen, in diesem Fall wird der 4. Eintrag ausgegeben.
    Wie ist dieses zu erhalten? Weiß jemand mehr?



  • zzz=0;
    while (arrayErg2[zzz].val==0)
        ++zzz;
    e2=arrayErg2[zzz].key;
    e3=arrayErg2[zzz].val;
    
    while (arrayErg2[zzz+1].val==e3)
        ++zzz;
    e2=arrayErg2[zzz].key;
    e3=arrayErg2[zzz].val;
    


  • ja, bei diesem bespiel würde das funktionieren, würde jedoch der array so aussehen:

    (0,0,0,100,100,100,100,300,400,500)

    würde wieder nicht der letzte betrag genommen werden. die überprüfung sollte variabel sein =b

    also in etwa so:

    int zzz=0;
    int help;
    
    while (arrayErg2[zzz].val==0)
        ++zzz; // jetzt haben wir die stelle an der der erste kleinste Wert nach 0 vorhanden ist
    
    help=zzz;
    while (arrayErg2[help].val < arrayErg2[zzz].val)
        ++zzz; // jetzt stehen wir um 1 über dem gewünschten index
    
    e2=arrayErg2[--zzz].key;
    e3=arrayErg2[zzz].val;
    

    so in etwa halt...



  • hups, hab mich verguckt, hattest eh recht xD



  • Danke bislang, aber manchmal gibt er das 1. Element nach der 0 und manchmal das letzte Element nach der 0 aus. Also es funktioniert so halb 🙂
    könnte noch etwas verändert werden, sodass nur noch das letzte element nach der 0 ausgegeben wird, in der ersten menge gleicher zahlen?



  • Dann zeig doch mal deinen aktuellen Code. Sonst wird es nur ein rumraten 🙂



  • ich habe deinen code verwendet.
    der von idetvo hat leider nicht funktioniert, weil dort dennoch die 0 ausgegeben worden ist.



  • klar... weil ich mich verschrieben hab in der eile xD

    es heisst nicht

    while (arrayErg2[help].val < arrayErg2[zzz].val)
    

    sondern

    while (arrayErg2[help].val <= arrayErg2[zzz].val)
    

    weil das erste kann nich funktionieren... xD

    angenommen ein array von:

    {0,0,100,100,100,200,500}

    dann wär 100 mit index 2 die erste kleinste zahl nebst 100... und weil ich dann überprüft habe ob die erste kleinste zahl nebst 100 kleiner ist der rest der nachkommt war klar das dies geschieht:

    denn: 100 ist nicht kleiner 100

    dann ist er beim speichern der werte um einen index zurück und war wieder bei einem index an diesem 0 gespeichert war.

    es konnte nur 0 gespeichert werden.



  • leider gibt mir das programm dann nicht die richtigen werte aus, es ist alles etwas verschoben...
    da ist Dirks Lösung schon eher das richtige, wenn auch leider noch nicht vollkommen...



  • Wenn ich es so mache kommt bei mir 6/ 100 heraus anhand deiner Beschreibung hoffe ich, dass dies dein erwünschtes Ergebnis ist.

    int eval = 0;
    	int ekey = 0;
    	int it=0; 
    
    	while((arrayErg[it].val==0 && it < arraysize) || (arrayErg[it].val == arrayErg[it + 1].val && it < arraysize - 1)) 
    		++it;
    
    	ekey=arrayErg[it].key; 
    	eval=arrayErg[it].val;
    

    PS: Die bedingung ist naja nicht so toll... habe zu wenig schlaf 😞



  • ich weiß ja nich was du jetzt anders machst, aber verwende ich meinen code auf einen x-beliebigen array funktionierts super... zeig mal deinen source-code...


Anmelden zum Antworten