Eigener Sortieralgorythmus



  • Vielleicht solltest du redo bei Gelegenheit mal wieder auf false setzen. Sonst terminiert's nicht.



  • wir sollen das ohne bubble sort machen ich muss einfach nur wissen wie ich mein programm weiter schreiben muss damit das das macht was ich will.

    for (int y=1;y+1>y;)
    {

    wie muss ich die schleife weiter schreiben
    und wie setzt ich die Abruchbedingung in C++ um
    also wenn kein tausch mehr stattgefunden hat zahlen in listbox ausgeben



  • Jester schrieb:

    Vielleicht solltest du redo bei Gelegenheit mal wieder auf false setzen. Sonst terminiert's nicht.

    ich hab keine Ahnung was du damit meinst ich bin ein blutiger anfänger



  • Hmm jetzt mal ganz im ernst. Du bist mehr als faul und dreist! 😡
    Das was euer Lehrer will ist nichts anderes als der BubbleSort Algorithmus. Ich hab dir jetzt sogar eine komplette Implementierung gegeben. Ließ einfach mal die Links die du bekommst ... dann fällt dir sowas auf!

    @Jester: Ja sorry ... hab es zu spät gesehen und hab es noch angefügt ... hab halt wie gesagt nicht getestet ... wie nie wenn ich was poste 😃 Nja is auch egal ...



  • ^^sorry 😞 aber trotzdem Danke
    könntest du deine lösung nochmal reinstellen



  • Ich habs nochmal probiert:

    void __fastcall TForm1::Button2Click(TObject Sender)
    {
    ListBox1->Clear();
    int
    zahlenfeld = new int[11];
    zahlenfeld[1] = StrToInt(Form1->Edit1->Text);
    zahlenfeld[2] = StrToInt(Form1->Edit2->Text);
    zahlenfeld[3] = StrToInt(Form1->Edit3->Text);
    zahlenfeld[4] = StrToInt(Form1->Edit4->Text);
    zahlenfeld[5] = StrToInt(Form1->Edit5->Text);
    zahlenfeld[6] = StrToInt(Form1->Edit6->Text);
    zahlenfeld[7] = StrToInt(Form1->Edit7->Text);
    zahlenfeld[8] = StrToInt(Form1->Edit8->Text);
    zahlenfeld[9] = StrToInt(Form1->Edit9->Text);
    zahlenfeld[10] = StrToInt(Form1->Edit10->Text);

    for
    {
    (if 11[y]> 11[y+1]);
    ( 11[y], 11[y+1]);

    }while 11[y]< 11[y+1];
    {
    ListBox1->Items->Add(IntToStr(zahlenfeld));
    }
    //---------------------------------------------------------------------------

    aber läuft halt immernoch nicht leider



  • Aicde schrieb:

    (if 11[y]> 11[y+1]);
        (   11[y], 11[y+1]);
    

    😕 was soll denn des 11[y]?



  • weiß ich auch nicht wie gesagt anfänger
    ich hab versucht das von wikipedia auf seite 1 umzusetzen
    nach dem ich aufgefodert wurde die links zu lesen die ich bekomme 🙂



  • Aicde schrieb:

    weiß ich auch nicht wie gesagt anfänger
    ich hab versucht das von wikipedia auf seite 1 umzusetzen
    nach dem ich aufgefodert wurde die links zu lesen die ich bekomme 🙂

    Guter Link muss ich auch mal lesen!!
    Ich denke das sollte eher zahlenfeld[y] heißen oder?
    Edit: nehms mir nicht übel aber ich würd dir empfehlen mal ein gutes Tutorial durchzumachen



  • Auszug aus Wikipedia

    Der Algorithmus sieht im Pseudocode so aus:

    prozedur bubbleSort( A : Liste sortierbarer Elemente ) definiert als:
    n := Länge( A ) - 1
    wiederhole
    vertauscht := falsch
    für jedes i in 0 bis n wiederhole:
    falls A[ i ] > A[ i + 1 ] dann
    vertausche( A[ i ], A[ i + 1 ] )
    vertauscht := wahr
    falls ende
    für ende
    n := n - 1
    während vertauscht
    prozedur ende

    ich kann damit nicht wirklich viel anfangen ich brauch mal jemand der mir c++ komplet erklärt besonders die umsetzung insbesodere Felder also arees und schleifen 🙂





  • Naja ich geb dir nochmal die Funktion ... ist allerdings in diesem Fall ne Template-Func ... also setz stattdessen einfach den entsprechenden Typ ein falls dein Compiler damit nicht klar kommt
    ...

    template <typename T>
    void bubble_sort(T*& arr, const std::size_t& size)
    {
    	bool redo = false;
    	do {
    		redo = false;
    		for (std::size_t i = 0; (i < (size - 1) && arr[i] != NULL && arr[i+1] != NULL); ++i)
    			if (arr[i] > arr[i + 1])		{ std::swap<T>(arr[i], arr[i + 1]); redo = true; }
    	} while (redo == true);	
    }
    

    ...



  • großes Dankeschön
    ich werd mich mal dransetzen und morgen hochladen



  • Hmm ich erklär ihn dir mal sicherheitshalber 😉

    template <typename T>
    void bubble_sort(T*& arr, const std::size_t& size) // also übergeben wird eine Referenz eines Zeigers auf einen Array vom Type T ... die Größe des Arrays (Anzahl Elemente) gibt size an.
    {
        bool redo = false; // Speichert ob wir nochmal durchlaufen müssen.
        do {
            redo = false; // Setzt am Anfang jedes Laufes redo wieder auf false zurück, da wir sonnst eine Endlosschleife hätten.
            for (std::size_t i = 0; i < (size - 1); ++i) // wir gehen alle Elemente des Arrays durch ...
                if (arr[i] > arr[i + 1])  // wenn das Element größer ist als das  folgende Element ...      
                { 
                    std::swap<T>(arr[i], arr[i + 1]); // ... müssen wir die einmal austauschen ... => arr[i] = arr[i+1] && arr[i + 1] = arr[i] 
                    redo = true; // Es war noch nicht alles richtig sortiert also müssen wir nochmal durchlaufen ...
                }
        } while (redo == true);   // erst aufhören wenn in der ganzen for-Schleife nie die Bedingung der if-Abfrage wahr war.
    }
    


  • Ein einfacher Algo wäre Insertion Sort: (im Pseudocode)

    Zahl key, Indizes i,j
    Feld A
    
    für j=2,...,n{
      key=A[j];
      i=j-1;
      solange i>0 und A[i]>key {
         A[i+1]=A[i];
         i=i-1;
      }
      A[i+1]=key;
    }
    

    Dabei werden immer die direkten Nachbarn verglichen und das Vergleichselement ggf. nach links verschoben.

    Bsp.:

    A[1]   A[2]   A[3]   A[4]   A[5]    A[6]
     5  <-> 2      4      6      1       3
     2      5  <-> 4      6      1       3
     2      4      5     >6<     1       3
     2  ->  4  ->  5 ->   6 ->   1       3
     |-------------------------- |
     1      2      4  ->  5  ->  6   ->  3
                   |---------------------|
     1      2      3      4      5       6
    


  • Ich habs fast fertig aber irgendwo ist noch ein fehler!!!

    void __fastcall TForm1::Button2Click(TObject Sender)
    {
    ListBox1->Clear();
    int
    zahlenfeld = new int[11];
    zahlenfeld[1] = StrToInt(Form1->Edit1->Text);
    zahlenfeld[2] = StrToInt(Form1->Edit2->Text);
    zahlenfeld[3] = StrToInt(Form1->Edit3->Text);
    zahlenfeld[4] = StrToInt(Form1->Edit4->Text);
    zahlenfeld[5] = StrToInt(Form1->Edit5->Text);
    zahlenfeld[6] = StrToInt(Form1->Edit6->Text);
    zahlenfeld[7] = StrToInt(Form1->Edit7->Text);
    zahlenfeld[8] = StrToInt(Form1->Edit8->Text);
    zahlenfeld[9] = StrToInt(Form1->Edit9->Text);
    zahlenfeld[10] = StrToInt(Form1->Edit10->Text);
    }

    template <typename y>
    void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size)
    {
    bool redo = false;
    do {
    redo = false;
    for (std::size_t i = 0; i < (size - 1); ++i)
    if (zahlenfeld[i] > zahlenfeld[i + 1])
    {
    std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]);
    redo = true;
    }
    } while (redo == true); }

    {
    ListBox1->Items->Add(IntToStr(zahlenfeld [i]));
    }

    //---------------------------------------------------------------------------

    C++ Fehler Deklarationn nicht ordnungsgemäß abgeschlossen 😕



  • was ist eigentlich ein template??????



  • Aicde schrieb:

    Ich habs fast fertig aber irgendwo ist noch ein fehler!!!

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      ListBox1->Clear();
      int* zahlenfeld = new int[11];
      zahlenfeld[1] = StrToInt(Form1->Edit1->Text);
      zahlenfeld[2] = StrToInt(Form1->Edit2->Text);
      zahlenfeld[3] = StrToInt(Form1->Edit3->Text);
      zahlenfeld[4] = StrToInt(Form1->Edit4->Text);
      zahlenfeld[5] = StrToInt(Form1->Edit5->Text);
      zahlenfeld[6] = StrToInt(Form1->Edit6->Text);
      zahlenfeld[7] = StrToInt(Form1->Edit7->Text);
      zahlenfeld[8] = StrToInt(Form1->Edit8->Text);
      zahlenfeld[9] = StrToInt(Form1->Edit9->Text);
      zahlenfeld[10] = StrToInt(Form1->Edit10->Text);
    }
    
    template <typename y>
    void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size) 
    {
      bool redo = false; 
      do { 
        redo = false;
        for (std::size_t i = 0; i < (size - 1); ++i)
          if (zahlenfeld[i] > zahlenfeld[i + 1])  
          { 
            std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]); 
            redo = true;           
          } 
       } while (redo == true);
    }
    
    {
      ListBox1->Items->Add(IntToStr(zahlenfeld [i]));
    }
    
    //---------------------------------------------------------------------------
    

    Nulltens: sfds

    Erstens: Steht der letzte Abschnitt wirklich so einsam in deiner Datei? Wenn ja, da fehlt der Funktionskopf zu diesem Rumpf.

    Zweitens: Wo rufst du die Sortierfunktion denn auf? Und mit welchen Parametern? (in der OnButton-Methode werden die Zahlen ab Index 1 eingetragen, die Sortierfunktion beginnt mit Index 0 zu sortieren)

    Drittens: Warum selber schreiben? std::sort() ist doch schon verfügbar.



  • zu Drittens: weil Hausaufgabe

    zu Erstens: ja!! also muss da noch Ausgabe hin oder so was ähnliches

    zu zweitens: also muss zwischen zeile 16-17 irgend ein aufruf????



  • Aicde schrieb:

    zu Erstens: ja!! also muss da noch Ausgabe hin oder so was ähnliches

    Ich weiß ja nicht, was du vorhast, aber auf jeden Fall muß dieser Code-Abschnitt in einer Funktion landen (eventuell sogar ans Ende der Button2Click()).

    zu zweitens: also muss zwischen zeile 16-17 irgend ein aufruf????

    Zwischen die Zeilen nicht (das wäre ja wieder außerhalb einer Funktion ;)), aber hinter Zeile 14 solltest du schon die Sortierfunktion aufrufen.

    PS: Ein Template ist eine Art Schablone für viele verschiedene Funktionen. Das heißt, anstatt je eine Sortierfunktion für int's, double's, string's oder hundekuchen zu schreiben, schreibst du eine Schablone für beliebige Typen (der Bezeichner 'y' ist übrigens etwas unüblich) und lässt dir vom Compiler genau die Variante(n) erzeugen, die du brauchst.


Anmelden zum Antworten