Zahlen sortieren von groß nach klein??



  • Wie kann ich dem Algorithmus Sort denn sagen, dass er von der Größten bis zur kleinsten Zahl sortieren soll und ned andersrum???



  • hallo

    der sort-Funktion einen zusätzlichen Vergleichsfunktor übergeben.

    bis bald
    akari



  • Bin zwar noch totaler Anfänger, aber ich hab mal versucht deinen Algorithmus in ein einfaches Beispiel einzufügen. Hoffe das hilft dir :

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    void bubblesort(int *ptr, int N);
    int main(int argc, char *argv[])
    {
        //Variablendeklaration
        int Arrayanzahl ;
    
        //Abfrage nach der Höhe des arrays
        cout << "Wie hoch soll der Array sein? "; cin >> Arrayanzahl;
    
        //Deklaration des Arrays
        int a[Arrayanzahl];
    
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  //Abfrage und Speicherung des arrays
                  cout << "Array[" << k << "] : ";
                  cin >> a[k];
        } 
    
        //Unsortierte Ausgabe
        cout << "\nUnsortierte Ausgabe" << endl;
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  cout << "Array[" << k << "] : " << a[k] << endl;
        }    
        // Sortieren mit bubblesort
        bubblesort (a , Arrayanzahl);
    
        //Sortierte Ausgabe
        cout << "\nSortierte Ausgabe" << endl;
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  cout << "Array[" << k << "] : " << a[k] << endl;
        }    
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    void bubblesort(int *ptr, int N)
    {
       int i;
       for (i = 1; i <= N-1; i++)
       {
          int j;
          for (j = 0; j < N-i; j++)
          {
             if (ptr[j] > ptr[j+1])
             {
                 int temp;
                 temp = ptr[j];
                 ptr[j] = ptr[j+1];
                 ptr[j+1] = temp;
             }
          }
       }
    }
    

    Wie kann ich dem Algorithmus Sort denn sagen, dass er von der Größten bis zur kleinsten Zahl sortieren soll und ned andersrum???

    Einfach bei der if anweisung der Operator (heißt das so?^^) umdrehen.
    also

    if (ptr[j] < ptr[j+1])
    

    Die vollständige Funktion sieht dann wiefolgt aus

    void bubblesort(int *ptr, int N)
    {
       int i;
       for (i = 1; i <= N-1; i++)
       {
          int j;
          for (j = 0; j < N-i; j++)
          {
             if (ptr[j] < ptr[j+1])
             {
                 int temp;
                 temp = ptr[j];
                 ptr[j] = ptr[j+1];
                 ptr[j+1] = temp;
             }
          }
       }
    }
    

    Bitte korrigiert mich wenn ich was falsch gesagt habe 🙂

    Weedjo



  • Wenn

    std::sort(anfang, limit); // verwendet std::less<Typ> um die Reihenfolge zu bestimmen
    

    aufsteigend sortiert, dann sortiert üblicherweise

    std::sort(anfang, limit, std::greater<Typ>());
    

    eben absteigend.
    Für "Typ" musst du den Typ der zu sortierenden Elemente angeben, also z.B. std::greater<int>() wenn es um Integers geht.

    'anfang' ist dabei ein Pointer (oder allgemein Random-Access-Iterator) auf das erste Element der Range.
    'limit' ist dabei ein Pointer (oder allgemein Random-Access-Iterator) auf das "hinterletzte" Element der Range, also auf das erste Element NACH dem letzten. In C++ wird "anfang" quasi immer als "begin" bezeichnet und "limit" als "end".
    'std::greater<Typ>()' ist der zu verwendende Vergleichs-Operator (Funktor), und wenn man nix angibt wird eben 'std::less<Typ>()' verwendet, was dazu führt dass in aufsteigender Reihenfolge sortiert wird.



  • Gut erklärt Plotzenhotz. Ist auch gar nicht so schwer
    Hier nochma nen Beispiel:

    int main(int argc, char *argv[])
    {
        //Variablendeklaration
        int Arrayanzahl ;
    
        //Abfrage nach der Höhe des arrays
        cout << "Wie hoch soll der Array sein? "; cin >> Arrayanzahl;
    
        //Deklaration des Arrays
        int a[Arrayanzahl];
    
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  //Abfrage und Speicherung des arrays
                  cout << "Array[" << k << "] : ";
                  cin >> a[k];
        } 
    
        //Unsortierte Ausgabe
        cout << "\nUnsortierte Ausgabe" << endl;
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  cout << "Array[" << k << "] : " << a[k] << endl;
        }    
    
        [u][b]std::sort (&a[0], &a[Arrayanzahl], std::greater<int>()) ;[/b][/u]
        //Sortierte Ausgabe
        cout << "\nSortierte Ausgabe" << endl;
        for ( int k=0 ; k<=Arrayanzahl-1; k++)
        {
                  cout << "Array[" << k << "] : " << a[k] << endl;
        }    
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Es werden hier also keine Werte, sondern nur die Adressen übergeben (wegen dem "&"). Hat was mit Zeigern zu tun 🙂



  • Weedjo schrieb:

    ...

    [u][b]std::sort (&a[0], &a[Arrayanzahl], std::greater<int>()) ;[/b][/u]
    

    ...

    OT: Interessant !!
    1.) Das cpp-Tag arbeitet nicht mit geschachtelten Tags (wie hier b+u) ..... das code-Tag schon !!
    2.) das u-Tag wird aber ignoriert.

    [cpp]
    std::sort (&a[0], &a[Arrayanzahl], std::greater<int>()) ;
    [/cpp]

    Gruß,

    Simon2.



  • Simon2 schrieb:

    OT: Interessant !!
    1.) Das cpp-Tag arbeitet nicht mit geschachtelten Tags (wie hier b+u) ..... das code-Tag schon !!
    2.) das u-Tag wird aber ignoriert.

    Ist mir auch aufgefallen, hab das einfach ignoriert, muss ja nich unbedingt funktionieren 😃
    Hauptsache der Algorithmus funzt zum schluss 😛

    Edit: Wo kann man sich eigentlich mal den std::sort angucken?



  • JaBBa88 schrieb:

    Wie kann ich dem Algorithmus Sort denn sagen, dass er von der Größten bis zur kleinsten Zahl sortieren soll und ned andersrum???

    naja ich dachte das macht der schon aber du muss wenn das umgekert sein sollte die if anweisug statt ">" in "<" oder umgekert je nach dem wie es sein sollte 😉



  • Weedjo schrieb:

    Edit: Wo kann man sich eigentlich mal den std::sort angucken?

    im header <algorithm>

    http://www.sgi.com/tech/stl/sort.html :

    [2] Earlier versions of sort used the quicksort algorithm (C. A. R. Hoare, Comp. J. 5, 1962), using a pivot chosen by median of three (R. C. Singleton, CACM 12, 1969). Quicksort has O(N log(N)) average complexity, but quadratic worst-case complexity. See section 5.2.2 of Knuth for a discussion. (D. E. Knuth, The Art of Computer Programming. Volume 3: Sorting and Searching. Addison-Wesley, 1975.) The current implementation of sort, however, uses the introsort algorithm (D. R. Musser, "Introspective Sorting and Selection Algorithms", Software Practice and Experience 27(8):983, 1997.) whose worst case complexity is O(N log(N)). Introsort is very similar to median-of-three quicksort, and is at least as fast as quicksort on average.



  • Wenn du einen Vektor sortieren willst, kannst du übrigens auch einfach die passenden Anfangs- und Endbedingungen wählen.

    std::sort(myVec.begin(), myVec.end()) für die Sortierung "von klein nach gross" in "normaler Leserichtung" oder
    std::sort(myVec.rbegin(), myVec.rend()) für die Sortierung "von klein nach gross" in umgekehrter Richtung. Das Resultat ist äquivalent.

    Ich benutze das vor allem, weil ich einen eigenen Datentyp nach mehreren Kriterien sortieren muss (Datum, Uhrzeit, fortlaufende Nummer, Abmessungen, ...). Allerdings fast immer absteigend, und nur in EINEM Fall aufsteigend (die Rangfolge der Kriterien ist immer identisch).


Anmelden zum Antworten