Zahlen sortieren von groß nach klein??



  • Hi,

    könnt ihr mir einen Algorithmus vorschlagen, womit ich Zahlen vergleichen kann???

    Ich brauche das, weil ich 12 Zahlen hab, die miteinander verglichen werden und dann soll von groß nach klein sortiert werden.

    Eine Anmerkung. Bei PHP gibt es einen Befehl, wmoit man einem Array sagen kann, dass es automaitsch sortieren soll. Gibt es so was auch bei C++?

    Und wäre es sinnvoller ein Array zu benutzen stat 12 Variablen? Bestimmt oder?

    Sorry die Suchfunktion funktioniert hier ned und bei Google hab ich was bei Wikipedia gefunden, wo ich aber nicht ganz durchblicke 🙂



  • #include <algorithm>

    sort(array, array+12);



  • Ohhhh wie geil. Das ist ja wirklich für dumme ^^ Ist dass das Bubblesort prinzip?



  • du kannst einfach den bekannten algorithmus bubelsort verwenden ist einfach zu implementieren in deinem Fall wird er auch schnell sein guck einfach unter dem Begriff bubelsort bei Google nach 😉



  • Ja das Problem ist, dass ich bei wiki nicht durchblicke hier mal der Code:

    Die N Elemente liegen in einem Feld vor (Index von 0...N-1) ptr enthält die Adresse des ersten Feldelementes (Index 0).
    
    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 jetzt einstellen, dass der von groß nach klein sortiert?



  • Du musst in der if Anweisung nur aus dem größer als ein kleiner als machen.



  • Ich mein jetzt bei der Sort(array,array+12). Wie kann ich da die größte zahl als 1. angeben?



  • Ich habe versuch meine Code zustellen auf die schnelle hoffe das der dir hilf ist kein funkion

    #include "stdafx.h"
    #include <iostream>

    using namespace std;

    int main()

    {
    int zahl[3] = {4,1,5};
    int temp=0;

    for(int i = 0; i<=2;i++)
    {
    for(int i = 0;i<=2;i++)
    {
    if (zahl[i]<zahl[i+1])
    {
    temp=zahl[i+1];
    zahl[i+1] = zahl[i];
    zahl[i]=temp;

    }
    }
    }

    for(int i = 0; i<=2;i++)
    {
    cout << zahl[i] << endl;
    }

    return 0;
    }



  • 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