Sortierverfahren



  • Hallo,

    vielleicht kann mir jemand helfen.
    Ich muss Funktionen für Sortierverfahren programmieren, aber nur als if anweisungen. Kann mir da einer bei helfen? Ich stehe da total auf den Schlauch. In for Schleifen ja okay, aber so. No Way.
    BITTE HELFT MIR.
    Vielen Dank.
    Mfg HouseFreak



  • Wieso?

    void sort(int* a, std::size_t size, std::size_t cur = 0)
    {
       if (cur < size && (cur + 1) < size && a[cur] > a[cur + 1])
       {
           int tmp = a[cur];
           a[cur] = a[cur + 1];
           a[cur + 1] = tmp;
       }
       if (size > cur + 1)
           sort(a, size, cur + 1);
    }
    

    ... bsw. ^^



  • Weil ich das ganze mit nem Timer zum Darstellen aufrufen muss und da geht es nicht mit For_Schleifen. Schon gut, jetzt noch ohne Funktion und perfekt. Natürlich auch den NAmen für das Sortierverfahren, wäre genial.

    Vielen Dank.

    Mfg



  • Ohne Funktion oder schleife geht es nicht ... zumindest wenn du die Größe nicht weißt ... ^^
    Ich ruf da ja auch nur die ganze Zeit die Funktion nochmal auf ^^



  • Die Größe weiss ich. Es sind 10 Elemente die im Array stehen und sortiert werden sollen. Jeder Schritt des tauschen soll dargestellt werden, deshalb benötige ich keine for Schleife - weil das UpdateAllViews darin nicht abgearbeitet wird.

    Mfg



  • du sollst eine menge mit 10 elementen sortieren, ohne schleifen oder rekursion zu verwenden?

    wer immer sich so eine hirnverbrandte aufgabe ausgedacht hat, gehört geschlagen.



  • Doch sowas geht:
    Hier ein Beispiel von mir:
    int Hilfe=0; // Hilfsvariablen

    // Funktion die die aktuellen Elemente nimmt
    pDoc->NimmAktElemente( m_iZaehlen1, m_iZaehlen2);

    if (m_iWert[m_iZaehlen2] < m_iWert[m_iZaehlen1]) // Vergleich Wert[j]<Wert[i]
    { // Vertausche Wert [j] mit Wert[i]
    Hilfe = m_iWert[m_iZaehlen2];
    m_iWert[m_iZaehlen2] = m_iWert[m_iZaehlen1];
    m_iWert[m_iZaehlen1] = Hilfe;

    //Darstellen der getauschten Werte
    pDoc->NimmWerte( m_iWert[0], m_iWert[1],m_iWert[2],m_iWert[3], m_iWert[4],
    m_iWert[5], m_iWert[6],m_iWert[7],m_iWert[8],m_iWert[9]);
    }
    m_iZaehlen2++;
    if (m_iZaehlen2 == 10)
    {
    m_iZaehlen1++;
    m_iZaehlen2=m_iZaehlen1+1;
    }
    if (m_iZaehlen1==9)
    { // Zurücksetzen der aktuellen Werte
    pDoc->NimmAktElemente( 0, 0);
    KillTimer(1); // Löschen des Timer 1
    }

    Das wir alles über nen Timer aufgerufen. Jetzt noch andere Sortierverfahren und ich wäre glücklich.

    Mfg



  • Achso ... kannst de jede beliebigen Algo nehmen ... nur die for-Schleife jeweils durch Membervariablen ersetzen ...



  • Andere Sortierverfahren als For Schleife sind ja einfach:

    Bubble Sort:
    for (int lauf=1; lauf <zaehler; lauf++)
    {
    for (int element=zaehler-1; element>=lauf; element--)
    {
    if (daten[element-1] > daten[element])
    { // vertauschen
    char tmp = daten[element-1];
    daten[element-1] = daten[element];
    daten[element] = tmp;
    }
    }
    }

    Insertion Sort:
    for (int a=1; a <zaehler; a++)
    {
    char tmp=daten[a];
    int b = a-1;
    while (b>=0 && tmp<daten[b])
    {
    daten[b+1] = daten[b];
    b--;
    }
    daten[b+1] = tmp;
    }
    }

    Könnte mir jemand diese 2 Sachen ändern? Schön wäre auch noch das QuickSort verfahren, aber ich glaube das ist schwieriger.

    VIelen Dank. Mfg



  • versuch es mal mit rekursion, anstatt einer for schleife
    also die Funktion ruft sich einfach immer am ende wieder selbst auf, bis sie sortiert ist, in dem fall einfach return. Das ist denke ich genau das, was dein Lehrer ham will.



  • Naja ... @Krux: Bist du der deutschen Sprache mächtig? Dann ließ bitte was hier bereits geschrieben wurde.

    @House-Freak: Wenn bei jedem Timeraufruf etwas passieren soll ... pack die 1. for-Schleife des Intersect Sort-Algo's mal in die Timerfunc. d.h. a als Membervariable ...



  • Hätte ich gedacht, dass das so schwer ist, hätte ich es gelassen.

    So habe jetzt versucht nen 2. und 3. Timer einzubauen mit anderen Sortierverfahren, aber irgendwie durchläuft der immer nur den 1. Timer.
    Auf die verschiedenen Event IDs habe ich geachtet. Könnt ihr mir da weiter helfen? Woran kann das liegen?

    Mfg House_Freak


Anmelden zum Antworten