Array sortieren



  • hi,
    kann mir jemand helfen, bei der Sortierung eines Arrays?
    Ich habe es bereits sortiert, möchte es verferinern.
    Bsp: mein arraySort[] = (1,1,1,3,4,4,5)
    hat die Positionen arraySort[].key, jetzt möchte ich die ersten gleichen Zahlen hier 3x1 in ein Array arraySortSort schreiben, genauer gesagt gleich die arraySort[].key's.
    Wie stelle ich dieses an, wenn ich es gern allgemeiner hätte, also nicht nur 3 mal die 1`?



  • Werte aus einem Array mit einfachstem Kriterium aufsammeln ist äußerst trivial, und dafür benötigst du schon Hilfe?



  • Da das Array bereits sortiert ist, kannst du doch einfach über die einzelnen Elemente iterieren und dabei die (hintereinander stehenden) gleichen Elemente durch Vergleiche heraussuchen (und deren Anzahl, Indizes o. Ä. speichern).



  • würde es denn gehen, eine if-Schleife innerhalb einer for-Schleife zu machen?

    for ( i =1; i< 10; i++){
     if (arraySort[0] == arraySort[i]{
    arraySortSort[i] = arraySort[i].key;
    }
    else
    {
    arraySortSort[0] = arraySort[0].key;
    }
    }
    

    würde so etwas funktionieren?



  • Der Code ist ja grauenhaft - und vermutlich nicht ganz durchdacht. Was sind das für Arrays, mit denen du da hantierst?

    PS: Kannst du noch einmal in verständlichem Deutsch erklären, was genau du aus diesem Array herausholen willst (und inwelcher Form)?



  • Ich vermute einfach mal, es handelt sich um ein Array von Strukturen, die einen Member namens "key" enthalten, welcher jeweils den Index des Elements vor der Sortierung enthält (das würde zumindest Sinn machen). Jetzt sollen die Indizes der (im Bespiel drei) kleinsten gleichen Werte gefunden werden (oder in der Art).

    Das ist jetzt aber nur geraten, Stimpy wird uns sicherlich aufklären.

    Stimpy schrieb:

    würde es denn gehen, eine if-Schleife innerhalb einer for-Schleife zu machen?

    for ( i =1; i< 10; i++){
     if (arraySort[0] == arraySort[i]{
    arraySortSort[i] = arraySort[i].key;
    }
    else
    {
    arraySortSort[0] = arraySort[0].key;
    }
    }
    

    würde so etwas funktionieren?

    Wenn du das erreichen möchtest, was ich beschrieben habe, dann ist die Idee mit der for-Schleife und dem Vergleich von arraySort[0] und arraySort[i] schon mal gut. Nur der Sinn des else-Zweiges erschließt sich mir leider nicht. Diese Zuweisung ließe sich auch einmal außerhalb der Schleife erledigen.

    Außerdem wird der Zugriff auf die Werte des Arrays so nicht klappen, wenn meine Vermutung mit den Strukturen richtig ist. Oder handelt es sich hier gar um Pseudo-Code?



  • nun ja, wenn ich zB ein Anfangsarray habe {1,4,3,4,1,5,1}, ist es ja sortiert {1,1,1,3,4,4,5} mit den Positionen '.key' {0,4,6,2,1,3,5}.
    die else Schleife wollte ich machen, falls die Menge nur aus einem gleichen sortierten AnfangsElement bestünde, zB {1,3,4,4,5}, müsste dieses nicht als Sonderfall betrachtet werden?



  • Stimpy schrieb:

    nun ja, wenn ich zB ein Anfangsarray habe {1,4,3,4,1,5,1}, ist es ja sortiert {1,1,1,3,4,4,5} mit den Positionen '.key' {0,4,6,2,1,3,5}.
    die else Schleife wollte ich machen, falls die Menge nur aus einem gleichen sortierten AnfangsElement bestünde, zB {1,3,4,4,5}, müsste dieses nicht als Sonderfall betrachtet werden?

    Ja, aber da es ja auf alle Fälle ein kleinstes Element gibt, lässt sich

    arraySortSort[0] = arraySort[0].key;
    

    auch einfach einmalig vor der for-Schleife zuweisen (abgesehen von dem Sonderfall, dass das Array leer ist). Jedenfalls muss das nur einmal geschehen. So, wie du es gemacht hast, würde arraySortSort[0] ja immer wieder neu gesetzt werden.

    Andere Möglichkeit: Der else-Zweig bleibt so, wie er ist, aber die for-Schleife wird abgebrochen, sobald ein Element gefunden wurde, das nicht mehr gleich dem ersten ist (sprich, es wird noch ein break an den else-Zweig angefügt). Dann besteht aber noch das Problem, dass der else-Block niemals ausgeführt wird, wenn alle Elemente des Arrays gleich sind. Eventuell wird also das erste Element von arraySortSort gar nicht gesetzt.



  • struct { int key,value; } arraySort[10];
    int i,j,merker,arraySortSort[10];
    
    for( merker=arraySort[0].value-1, i=0, j=0; i<ARRAYGROESSE ; i++)
    {
      if( merker!=arraySort[i].value )
      {
        arraySortSort[j++]=merker=arraySort[i].value;
      }
    }
    
    while( j-- )
      printf("\n%d",arraySortSort[j]);
    

Anmelden zum Antworten