Sortieren...

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hi, ich möchte etwas in ein Programm einauen, von dem ich nicht weiß, wie ich es realisieren kann:
    Es gibt 4 verschiedene Personen/Gegenstände, die jeweils 2 Kriterien besitzen, Ein Kriterium ist also ein Wert. Nun möchte ich die 4 Personen/Gegenstände nach ihren erstem Kriterium sortieren. Also auf Platz 1 ist die Person oder der Gegenstand mit dem höchsten Wert bei Kriterium 1, auf Platz 2 die Person oder der Gegenstand mit dem nächstgrößeren Wert usw.
    Wenn nun aber z.B. 2 Personen oder Gegenstände beim ersten Kriterium denselben Wert haben, sollen die nach dem zweiten Kriterium sortiert werden.
    Eine weitere Schwierigkeit ist, dass die ganzen Werte variabel sein sollen...
    Also, wie (zur Hölle) soll ich das machen??
    Gruß,
    Pit
    P.S.: Das alles in C, sry, hatte ich vergessen...
  • hmm ich weiss ja nicht wie schnell und optimal die Funktion sein, aber vielleicht kannst du dir eine einfache Funktion selber bauen...

    Quellcode

    1. struct Person{
    2. int wert1;
    3. int wert2;
    4. }
    5. const int size=4;
    6. Person feld[size];//hier die Personen einfügen
    7. int sort(Person* feld, int size){
    8. for(int index=0;index<size;index++){
    9. for(int index2=index;index2<(size-1);index2++){
    10. Person tmp;
    11. if(feld[index].wert1>feld[index2+1].wert1){
    12. tmp = feld[index2+1];
    13. feld[index2+1] = feld[index];
    14. feld[index] = tmp;
    15. }
    16. if(feld[index].wert1==feld[index2+1].wert1){
    17. if(feld[index].wert2>feld[index2+1].wert2){
    18. tmp = feld[index2+1];
    19. feld[index2+1] = feld[index];
    20. feld[index] = tmp;
    21. }
    22. }
    23. }
    24. }
    Alles anzeigen


    dazu bleibt zu sagen, dass es wesentlich bessere algos zum sortieren gibt...
    ist ja nur als Anregung gedacht
  • Eine weitere Schwierigkeit ist, dass die ganzen Werte variabel sein sollen...

    definier das genauer !
    Ich vermute mal die ganz harte schiene, du willst die kriterien zur laufzeit aendern .... ^^

    prinzipielle vorgehensweisse:
    - man nimmt nen sortierbaren (nicht assiozativen) container .... std::list bietet sich dafuer an ....
    - wirft alle seine elemente dafuer rein ....
    - zum sortieren braucht man dann ne hilfsfunktion fuer den container, die man vor dem sortieren parametriesieren kann -> klarer fall fuer nen funktor !

    die list verlangt zum ssortieren nen lesser ... also ruft irgendwas mit bool (const c & rx1, const c & rx2) auf. c ist der typ den im container ddrinnhasst

    also baust nen funktor dafuer ...

    Quellcode

    1. class Myclass_Lesser
    2. {
    3. public:
    4. Myclass_Lesser(int Krit1, int Krit2, bool Ascending): // beim konstruktor geben wir gleich die sortieranweisung mit, also was und wie sortiert werden soll .....
    5. mkrit1(Krit1),mKrit2(Krit2),mAsc(Ascending) // brauchen spaeter ja nach was wir sortieren wollen
    6. {
    7. }
    8. ~Myclass_Lesser(){}
    9. // und demits nen funktor wird
    10. bool operator () (const c & rx1, const c & rx2)
    11. {
    12. // und hier anhand der kriterien und asc zuerueckgeben, ob rx1 < rx2 ist ....
    13. // wie das ueberlass ich dir ....
    14. }
    15. private:
    16. int mkrit1,mkrit2;
    17. bool mAsc;
    18. }
    Alles anzeigen


    Und benutzen wuerde man das dann so ....

    Quellcode

    1. std::list<c> mylist;
    2. // viele elemente einfuegen ....
    3. // sortierer (funktor) definieren
    4. Myclass_Lesser sortierer (3,2,true); // nach kriterium 3, dann 2 und aufsteigend sortieren ....
    5. // anwenden
    6. mylist.sort(sortierer);


    statt list und dem member sort kann man auch vector queue etc und den std::sort aus den allgemeinen allgos nehmen ....

    deine objecte werden beim sortieren u.U. mehrmals kopeiert. sind deine objecte recht gross, dauert das wahrscheinlich recht lange ....
    dann alternativ in ner liste die objecte reinpumpen, die als holder dient, und ne zweite liste die nur zeiger auf die elemente in liste 1 dient. die 2 liste sortieren, der typ ist dann nicht mehr c sondern c * .... aber selber prinzip . so wird statt dem kompletten obj nur nen zeiger verschoben ,....

    hoffe das hilft ...

    kauf dirn gutes buch ueber die STL :)

    Ups, C . ich les es grad ... C++ macht vieeles einfacher ....

    unter C wie oben ... nur wuerd ich mehr mit unterfunktionen arbeiten ....

    wie man unter c effektiv sortiert ... googlee mal nach bubblesort und co ...

    ciao ...
  • ich glaube die von mir verwendeten Mittel sind schon recht einfach gewählt.

    Quellcode

    1. for(int index=0;index<size;index++)

    steppt wert für wert durch das feld

    Quellcode

    1. for(int index2=index;index2<(size-1);index2++)

    ermöglicht, dass pro Stepp der selektierte Wert aus der ersten FOR-Schleife mit dem verbliebenen Rest des Feldes verglichen wird.
    Ist ein Wert größer, wird er mit dem Kleineren getauscht, dass geht so lange, bis die innere FOR-Schleife einmal durch ist. Danach wird der zweite Wert des Feldes mit allen anderen verglichen und bei Bedarf getauscht.
    Bis auch die äußere FOR-Schleife durch ist. Pro Durchlauf der äußeren FOR-schleife, läuft (3-index)mal die innere FOR-Schleife durch.
    Sind zwei Werte gleich groß wird abhängig vom zweiten Wert der Person getauscht.
    Wenn dir was unklar ist, solltest du spezifisch dazu fragen.
    Da dir in meinem Bsp schon einiges unklar ist, wird dir der Vorschlag von Sussi die STL zu verwenden, vorerst nicht weiter helfen. Allerdings ist der Hinweis, ein Buch zu diesem Thema zu lesen, nur empfehlenswert.
  • Hi, danke erstmal für die ganzen Antworten. Nett dass ihr mir helfen wollt. Ich hab mir das jetzt mal alles angeguckt, und würde gern ein paar konkrete Fragen stellen, damit ich das verstehe.
    Also, ich glaube es wäre gut, wenn wir über dieselben Variablen reden würden, dann wär das schon mal übersichtlicher. Nehmen wir an, mein bisheriges Programm sieht so aus:

    Quellcode

    1. int krit1[5];
    2. int krit2[5];
    3. main()
    4. {
    5. krit1[1]=2;
    6. krit1[2]=1;
    7. krit1[3]=1;
    8. krit1[4]=0;
    9. krit2[1]=4;
    10. krit2[2]=3;
    11. krit2[3]=2;
    12. krit2[4]=-1;
    13. }
    Alles anzeigen


    Gut, also ich geh jetzt mal von Icemakers' Vorschlag aus, der ist glaub ich wirklich nicht so schwer.
    Also als erstes kenn ich struct nicht (Z.2)
    Const int kenn ich auch nicht (Z.6)
    Sort kenn ich nicht (Z.8 )
    Dieses * versteh ich nicht, heißt das da malnehmen?
    Und wieso da feld vorkommt raff ich auch nicht, das ist doch nirgends definiert?
    Ok, ich glaub, wenn ihr mir das erklären könntet, würde ich schon mal weiterkommen.
    Sry, dass das so ne Pullerfragen sind, aber naja...
    Dank euch! :wink:
  • Hi,
    mit

    Quellcode

    1. struct Person{
    2. int wert1;
    3. int wert2;
    4. }
    deklarierst du einen neuen Datentyp mit dem Namen Person.
    Dieser Datentyp hat die beiden int Attribute wert1 und wert2.
    Du kannst dann einfach ein Exemplar dieses Datentyps erstellen und die Attribute einzeln ansprechen.
    z.B.

    Quellcode

    1. Person person;
    2. person.wert1 = 69;

    struct hat unter C++ die gleiche Bedeutung wie class(sofern dir das was sagt) ausser dass der Defaultzugriff auf Attribute und Methoden public ist.

    Mit const int legst du eine Variable an, der nur bei ihrer Initialisierung ein Wert zugewiesen werden kann.Im weiteren Verlauf des Codes ist es nicht mehr möglich diese (normal) zu ändern.Jeder Versuch wird vom Compiler angeprangert.

    In der Zeile mit sort wird ne neue Funktion definiert,die ein Array von Personenobjekten übergeben bekommt.Dieses Array wird vom Compiler intern aber als Zeiger auf Person interpretiert.Da könnte auch stehen:

    Quellcode

    1. int sort(Person feld[], int size)

    In dem Augenblick in dem ein Array als Parameter an eine Funktion übergeben wird funktioniert sizeof(arr)/sizeof(arr[0]) nicht mehr deshalb muss als zweiter Parameter die Anzahl der Elemente übergeben werden.Mit dem Personen Zeiger und der Anzahl der Elemente kannst du dann innerhalb der Funktion was anfangen.

    feld ist durchaus definiert worden:

    Quellcode

    1. Person feld[size];//hier die Personen einfügen

    feld ist ein Array von Personenobjekten das maximal 4 Elemente aufnehmen kann.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)