bubblesort ohne Zaehlvariablen nur mit Zeigern?



  • Hi!

    Weiß einer wie man das ungefähr umsetzen kann?
    Bin da völlig ratlos 😞

    lg



  • Um es mal genauer zu fragen:
    sagt mal wie kann ich diesen Ausschnitt(bubblesort)
    ohne die Zählvariablen(i,j) schreiben,
    wenn ich nur Pointer *pointeri,*pointerj
    gegeben habe?

    if (folge[j] > folge[j+1]) { // Tauschen der Zahlen feld[j] mit feld[j+1] h = folge[j]; folge[j] = folge[j+1]; folge[j+1] = h; getauscht = true;
    


  • if (folge[j] > folge[j+1])
    {
    
    h = folge[j];
    folge[j] = folge[j+1];
    folge[j+1] = h;
    getauscht = true;
    


  • Du wendest halt statt den Indizes Zeiger an. folge[j] wäre dann pointerj . Mit Zeigerarithmetik (Operatoren + , - , ++ , -- ) und Dereferenzierung (Operator * ) kannst du das Gleiche erreichen.

    Übrigens würde ich für das Tauschen entweder std::swap() verwenden oder eine eigene Funktion schreiben, die die Inhalte zweier Zeiger vertauscht.

    P.S.: In Zukunft bitte [cpp]-Tags verwenden... 😉



  • also hab das mal versucht,bin aber ein bissl ratlos.
    Komme mit den Pointern ganz durcheinander 🙂
    Kannst vielleicht mal drüber gucken?

    [cpp]
    #include <iostream>
    using namespace std;

    int main() {
    int folge[8] = { 12, 55, 14, 17, 31, 33, 22, 41 };
    int h;
    int *pointeri, *pointerj, *pointerk;
    for(pointeri = folge+7; pointeri >= folge+1; pointeri--)
    {
    getauscht = false;

    for(pointerj = 0;pointerj < pointeri; pointerj++)
    {
    if (*pointeri > *(pointeri+1))
    {

    h = *pointerj;
    *pointerj = *(pointerj+1);
    *(pointerj+1)= h;
    getauscht = true;

    if (!getauscht) break;
    else
    {
    for(pointerk = 0;pointerk < folge+7; pointerk++) cout << *pointerk << " ";
    cout << endl;
    }

    return 0;
    }



  • #include <iostream>
    using namespace std;
    
    int main() {
    int folge[8] = { 12, 55, 14, 17, 31, 33, 22, 41 };
    int h;
    int *pointeri, *pointerj, *pointerk;
    for(pointeri = folge+7; pointeri >= folge+1; pointeri--)
    {
    getauscht = false;
    
    for(pointerj = 0;pointerj < pointeri; pointerj++)
    {
    if (*pointeri > *(pointeri+1))
    {
    
    h = *pointerj;
    *pointerj = *(pointerj+1);
    *(pointerj+1)= h;
    getauscht = true;
    
    if (!getauscht) break;
    else
    {
    for(pointerk = 0;pointerk < folge+7; pointerk++) cout << *pointerk << " ";
    cout << endl;
    }
    
    return 0;
    }
    


  • Ich nehm' mal an, du bist auch an der MLU und musst die Aufgabe bis morgen 23:59 eingeschickt haben ^^
    Was kommt bei dir für'ne Ausgabe? Hab's fast genauso, nur in der for-Schleife ptrj = folge bzw. dann ptrk = folge..
    Aber es kommt einfach keine Ausgabe...weiss auch nicht weiter grade



  • Ok, hab' es jetzt doch hinbekommen, hatte nur 2 Klammern vergessen 😃



  • #include <iostream>
    using namespace std;
    
    int main() {
    int folge[8] = { 12, 55, 14, 17, 31, 33, 22, 41 };
    int h;
    int *pointeri, *pointerj, *pointerk;
    for(pointeri = folge+7; pointeri >= folge+1; pointeri--)
    {
    getauscht = false;
    
    for(pointerj = folge -1 ;pointerj < pointeri; pointerj++)
    {
    if (*pointeri > *(pointeri+1))
    {
    
    h = *pointerj;
    *pointerj = *(pointerj+1);
    *(pointerj+1)= h;
    getauscht = true;
    
    if (!getauscht) break;
    else
    {
    for(pointerk = folge ;pointerk < folge+7; pointerk++) cout << *pointerk << " ";
    cout << endl;
    }
    
    return 0;
    }
    

    so müsste es stimmen



  • FoxM schrieb:

    #include <iostream>
    using namespace std;
    
    int main() {
    int folge[8] = { 12, 55, 14, 17, 31, 33, 22, 41 };
    int h;
    int *pointeri, *pointerj, *pointerk;
    for(pointeri = folge+7; pointeri >= folge+1; pointeri--)
    {
    getauscht = false;
    
    for(pointerj = folge;pointerj < pointeri; pointerj++)
    {
    if (*pointeri > *(pointeri+1))
    {
    
    h = *pointerj;
    *pointerj = *(pointerj+1);
    *(pointerj+1)= h;
    getauscht = true;
    
    if (!getauscht) break;
    else
    {
    for(pointerk = folge ;pointerk < folge+7; pointerk++) cout << *pointerk << " ";
    cout << endl;
    }
    
    return 0;
    }
    

    so müsste es stimmen

    Nee, so is' richtig 😃



  • kk,vielen dank 🙂

    Saß da irgendwie fest und kam nicht weiter.
    Richtig, die MLU ist überall 🙂


Anmelden zum Antworten