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???
-
-
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.
alsoif (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 schlussEdit: 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).