Sortierung in C++



  • Hallo Leute, ich bin neu in C++ und wollte mir mal mit Hilfe meines Kumpels einen kleinen Sortierer basteln, momentan soll er nur Zahlen in einem festgelegten Bereich eines Arrays vergleichen. (Später sollen mal ein paar Dateien anhand ihrer Größe und verschiedene andere Dinge sortiert werden, aber das ist eine wie schon erwähnt spätere Angelegenheit.) Jedenfalls hat mein Kumpel von seinem Prof. ein altes Übungsblatt rausgekramt, auf der recht gut erläutert ist, was ich machen will, nur hab ich so richtig kein Plan wie, da ich wie gesagt noch neu in C++ bin.
    Ich stelle hier mal die Aufgabe rein:
    "Schreiben Sie eine Funktion isSorted in C++, die einen vorgegebenen
    Teilbereich eines Arrays über int-Werten auf Sortiertheit bezüglich der
    Relation "kleiner-gleich" prüft. Parameter sollen das Array, der Anfangsindex des
    Bereichs und der auf das Ende des Bereichs folgende Index (kann
    unmittelbar außerhalb des Arrays liegen) sein.
    Der Rückgabetyp soll einen Wahrheitswert repräsentieren. "
    Könnte hier mal Jemand einen Anstoß oder Tipp geben?


  • Global Moderator

    Brauchst du alles nicht. Einfach std::sort und fertig.

    (Mir ist natürlich klar, dass du jemanden suchst, der dir die Hausaufgaben macht, aber ein bisschen Mühe kannst du dir bei deiner Geschichte schon geben)



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum MFC (Visual C++) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wozu brauchst du eine Funktion isSortet, wenn du einen Sortierer basteln willst?



  • #include <iostream>
    
    bool isSorted(const int* p, size_t s, size_t e)
    {
    	for(++s;s!=e;++s)
    	{
    		if(p[s-1] > p[s])
    			return false;
    	}
    	return true;
    }
    
    int main()
    {
    	int v[]= {-2,3,5,6,6,5};
    	std::cout << isSorted(v,0,6) << '\n';
    }
    


  • manni66 schrieb:

    Wozu brauchst du eine Funktion isSortet, wenn du einen Sortierer basteln willst?

    ich möchte das später in verschiedene andere dinge mit einbinden, deswegen als funktion, aber danke für deine antwort 🙂



  • dudelDöDiriDuDiDudelDö schrieb:

    #include <iostream>
    
    bool isSorted(const int* p, size_t s, size_t e)
    {
    	for(++s;s!=e;++s)
    	{
    		if(p[s-1] > p[s])
    			return false;
    	}
    	return true;
    }
    
    int main()
    {
    	int v[]= {-2,3,5,6,6,5};
    	std::cout << isSorted(v,0,6) << '\n';
    }
    

    Danke dudelDöDiriDuDiDudelDö, werde es gleich mal ausprobieren. 😉 😋

    ps.: Ach eins hatte ich ja noch total vergessen, ich wünsche euch allen ein gesundes Neues Jahr und daraufhin auch viel Glück, bei dem was ihr so alles tut 🙂


  • Global Moderator

    ProjectCenix schrieb:

    manni66 schrieb:

    Wozu brauchst du eine Funktion isSortet, wenn du einen Sortierer basteln willst?

    ich möchte das später in verschiedene andere dinge mit einbinden, deswegen als funktion, aber danke für deine antwort 🙂

    Du hast die Frage nicht verstanden. Es ging nicht darum, wieso du etwas in Form einer Funktion brauchst (das ist sowieso selbstverständlich). Die Frage war, warum du eine Funktion brauchst, die nicht das tut, wonach du eigentlich gefragt hast, sondern stattdessen prüft, ob das, wonach du gefragt hast, bereits geschehen ist.

    (Mir ist natürlich klar, dass die wahre Antwort dafür ist: Weil es die Aufgabenstellung deiner Hausaufgabe ist. Dies ist ein typischer erster Aufgabenteil für eine Hausaufgabe zu Sortierfunktionen. Dass sich dies mit deiner Coverstory beisst, habe ich ja schon weiter oben festgestellt.)



  • SeppJ schrieb:

    ProjectCenix schrieb:

    manni66 schrieb:

    Wozu brauchst du eine Funktion isSortet, wenn du einen Sortierer basteln willst?

    ich möchte das später in verschiedene andere dinge mit einbinden, deswegen als funktion, aber danke für deine antwort 🙂

    Du hast die Frage nicht verstanden. Es ging nicht darum, wieso du etwas in Form einer Funktion brauchst (das ist sowieso selbstverständlich). Die Frage war, warum du eine Funktion brauchst, die nicht das tut, wonach du eigentlich gefragt hast, sondern stattdessen prüft, ob das, wonach du gefragt hast, bereits geschehen ist.

    (Mir ist natürlich klar, dass die wahre Antwort dafür ist: Weil es die Aufgabenstellung deiner Hausaufgabe ist. Dies ist ein typischer erster Aufgabenteil für eine Hausaufgabe zu Sortierfunktionen. Dass sich dies mit deiner Coverstory beisst, habe ich ja schon weiter oben festgestellt.)

    sry dass ich das jetzt mal so schreiben muss, aber seppj, wenn ich zeug für eine hausaufgabe bräuchte, dann hätte ich das rein geschrieben, wenn du ebenfalls genau gelesen hättest wie du mehr oder weniger indirekt behauptest, hättest du gelesen, dass der text tatsächlich aus einer übung ist, nur nicht von mir, da ich wie gesagt eben erst damit anfange c++ zu lernen und mein kumpel früher informatik studiert hat.
    natürlich stellt man sich da die frage, warum habe ich ihn nicht einfach gefragt, kann ich dir auch sagen, da mein kumpel mittlerweile in graz wohnt und familie hat ist es nicht leicht, bzw. dauertes immer ewig, dass er sich mal melden kann. nur mal so als kleine info am rande.

    so jetzt zum teil mit der funktionsfrage. die hatte ich tatsächlich falsch verstanden. also warum brauche ich eine funktion die das prüft. im endeffekt ist die nur eine absichtung, da im dem bereich in dem die dateien eingelagert werden ab und zu neu sortiert werden müsste, aber nicht immer, ich hätte das zum beispiel auch mit einer if-anweisung oder ähnlichem lösen können,keine frage jedoch möchte ich das nur bei bestimmten aktionen, in der nicht jedesmal nachher nachgeprüft werden kann, ob neu sortiert werden müsste.

    ich denke mal, dass es jedoch jetzt unnötig wird, mit dir weiter darüber zu diskutieren, denn ich hab meine antwort ja bekommen, und werde nun weiter friedlich an meinem progrämmchen basteln. 🙂

    nochmals danke
    dudelDöDiriDuDiDudelDö

    liebe grüße
    cenix


  • Global Moderator

    Wenn's keine Hausaufgabe wäre, wieso wäre std::sort dann nicht die Antwort?

    Ja, klar...



  • Wenn es keine Einschrängungen bzgl. der Benutzung des Standards gibt, so geht das auch so:

    #include <algorithm>
    #include <cassert>
    
    bool isSorted(const int* arr, std::size_t from, std::size_t to)
    {
        return std::adjacent_find(arr + from, arr + to, [](int prev, int next) { return !(prev <= next); }) == arr + to;
    }
    
    int main()
    {
        int arr[] = {19, 3, 17, 17, 129, -3, 102, 102, 2};
        assert( isSorted(arr, 1, 5));
        assert(!isSorted(arr, 0, 2));
        assert(!isSorted(arr, 6, 9));
        assert( isSorted(arr, 5, 8));
        assert( isSorted(arr, 0, 1));
    }
    

    der Code von dudelDöDiriDuDiDudelDö versagt bei einem leeren Intervall.



  • Seit C++11 gibt es die Standardfunktion

    bool std::is_sorted( ForwardIt first, ForwardIt last );
    

    Header: <algorithm>



  • Kenner von C++ schrieb:

    bool isSorted(const int* arr, std::size_t from, std::size_t to)
    {
        return std::adjacent_find(arr + from, arr + to, [](int prev, int next) { return !(prev <= next); }) == arr + to;
    }
    
    bool issorted(auto it, auto sen) {return std::adjacent_find(it, sen, std::greater<>{}) == sen;}